Yalantis/uCrop · error · CImgArgumentException

cimg::load_network(): Specified destination string is (null)

Error message

cimg::load_network(): Specified destination string is (null).

What it means

cimg::load_network() requires a writable local destination buffer (char*) where the downloaded file path is stored. This CImgArgumentException is thrown when that destination pointer is null. The URL may be perfectly valid — only the output location is missing.

Source

Thrown at ucrop/src/main/jni/CImg.h:70063

    //! Load file from network as a local temporary file.
    /**
       \param url URL of the filename, as a C-string.
       \param[out] filename_local C-string containing the path to a local copy of \c filename.
       \param timeout Maximum time (in seconds) authorized for downloading the file from the URL.
       \param try_fallback When using libcurl, tells using system calls as fallbacks in case of libcurl failure.
       \param referer Referer used, as a C-string.
       \param user_agent User agent used, as a C-string.
       \return Value of \c filename_local.
       \note Use the \c libcurl library, or the external binaries \c wget or \c curl to perform the download.
    **/
    inline char *load_network(const char *const url, char *const filename_local,
                              const unsigned int timeout, const bool try_fallback,
                              const char *const referer, const char *const user_agent) {
      if (!url)
        throw CImgArgumentException("cimg::load_network(): Specified URL is (null).");
      if (!filename_local)
        throw CImgArgumentException("cimg::load_network(): Specified destination string is (null).");
      if (!network_mode())
        throw CImgIOException("cimg::load_network(): Loading files from network is disabled.");

      const char *const __ext = cimg::split_filename(url), *const _ext = (*__ext && __ext>url)?__ext - 1:__ext;
      CImg<char> ext = CImg<char>::string(_ext);
      *filename_local = 0;
      if (ext._width>16 || !cimg::strncasecmp(ext,"cgi",3)) *ext = 0;
      else cimg::strwindows_reserved(ext);
      do {
        cimg_snprintf(filename_local,256,"%s%c%s%s",
                      cimg::temporary_path(),cimg_file_separator,cimg::filenamerand(),ext._data);
      } while (cimg::path_exists(filename_local));

#ifdef cimg_use_curl
      const unsigned int omode = cimg::exception_mode();
      cimg::exception_mode(0);
      try {
        CURL *curl = 0;

View on GitHub (pinned to f788b534b4)

Solutions

  1. Allocate/prepare a non-null destination buffer (sufficient for the resulting local filename) before the call.
  2. Check any pointer-producing expression (malloc, .data(), c_str() of a temporary) for null before passing it.
  3. Catch CImgArgumentException to report 'missing destination path' instead of a native crash.
  4. Simplify by passing a std::string-backed buffer owned for the call's duration.

Example fix

// before
char *local = NULL;
cimg::load_network(url, local, 0, true, 0, 0); // throws
// after
char local[1024];
cimg::load_network(url, local, 0, true, 0, 0);
Defensive patterns

Strategy: validation

Validate before calling

char localPath[1024]; // preallocated before the call
cimg::load_network(url, localPath, 30, true, 0, 0);

Type guard

bool writableBuffer(char *buf, size_t n) { return buf != nullptr && n >= 512; }

Try / catch

try { img.load_network(url, local, 30, true, 0, 0); } catch (const CImgArgumentException &e) { fprintf(stderr, "destination buffer missing: %s", e.what()); }

Prevention

When it happens

Trigger: Calling cimg::load_network(url, NULL, timeout, ...) directly, or passing an uninitialized/failed std::vector<char>.data(), or a null local-path variable forwarded from a wrapper like CImg<T>::load_network.

Common situations: Callers who only prepared the URL and forgot the destination string; dynamic allocation that failed and returned null without being checked; JNI code dropping the local-path parameter.

Related errors


AI-assisted analysis of Yalantis/uCrop@f788b534b4 (2026-09-08). Data as JSON: /api/errors/124a7232293950da. Report an issue: GitHub.