• Show log

    Commit

  • Hash : 607b668f
    Author : DRC
    Date : 2022-02-10T11:33:49

    MSVC: Eliminate C4996 warnings in API libs
    
    The primary purpose of this is to encourage adoption of libjpeg-turbo in
    downstream Windows projects that forbid the use of "deprecated"
    functions.  libjpeg-turbo's usage of those functions was not actually
    unsafe, because:
    
    - libjpeg-turbo always checks the return value of fopen() and ensures
      that a NULL filename can never be passed to it.
    
    - libjpeg-turbo always checks the return value of getenv() and never
      passes a NULL argument to it.
    
    - The sprintf() calls in format_message() (jerror.c) could never
      overflow the destination string buffer or leave it unterminated as
      long as the buffer was at least JMSG_LENGTH_MAX bytes in length, as
      instructed. (Regardless, this commit replaces those calls with
      snprintf() calls.)
    
    - libjpeg-turbo never uses sscanf() to read strings or multi-byte
      character arrays.
    
    - Because of b7d6e84d6a9283dc2bc50ef9fcaadc0cdeb25c9f, wrjpgcom
      explicitly checks the bounds of the source and destination strings
      before calling strcat() and strcpy().
    
    - libjpeg-turbo always ensures that the destination string is
      terminated when using strncpy().
      (548490fe5e2aa31cb00f6602d5a478b068b99682 made this explicit.)
    
    Regarding thread safety:
    
    Technically speaking, getenv() is not thread-safe, because the returned
    pointer may be invalidated if another thread sets the same environment
    variable between the time that the first thread calls getenv() and the
    time that that thread uses the return value.  In practice, however, this
    could only occur with libjpeg-turbo if:
    
    (1) A multithreaded calling application used the deprecated and
    undocumented TJFLAG_FORCEMMX/TJFLAG_FORCESSE/TJFLAG_FORCESSE2 flags in
    the TurboJPEG API or set one of the corresponding environment variables
    (which are only intended for testing purposes.)  Since the TurboJPEG API
    library only ever passed string constants to putenv(), the only inherent
    risk (i.e. the only risk introduced by the library and not the calling
    application) was that the SIMD extensions may have read an incorrect
    value from one of the aforementioned environment variables.
    
    or
    
    (2) A multithreaded calling application modified the value of the
    JPEGMEM environment variable in one thread while another thread was
    reading the value of that environment variable (in the body of
    jpeg_create_compress() or jpeg_create_decompress().)  Given that the
    libjpeg API provides a thread-safe way for applications to modify the
    default memory limit without using the JPEGMEM environment variable,
    direct modification of that environment variable by calling applications
    is not supported.
    
    Microsoft's implementation of getenv_s() does not claim to be
    thread-safe either, so this commit uses getenv_s() solely to mollify
    Visual Studio.  New inline functions and macros (GETENV_S() and
    PUTENV_S) wrap getenv_s()/_putenv_s() when building for Visual Studio
    and getenv()/setenv() otherwise, but GETENV_S()/PUTENV_S() provide no
    advantages over getenv()/setenv() other than parameter validation.  They
    are implemented solely for convenience.
    
    Technically speaking, strerror() is not thread-safe, because the
    returned pointer may be invalidated if another thread changes the locale
    and/or calls strerror() between the time that the first thread calls
    strerror() and the time that that thread uses the return value.  In
    practice, however, this could only occur with libjpeg-turbo if a
    multithreaded calling application encountered a file I/O error in
    tjLoadImage() or tjSaveImage().  Since both of those functions
    immediately copy the string returned from strerror() into a thread-local
    buffer, the risk is minimal, and the worst case would involve an
    incorrect error string being reported to the calling application.
    Regardless, this commit uses strerror_s() in the TurboJPEG API library
    when building for Visual Studio.  Note that strerror_r() could have been
    used on Un*x systems, but it would have been necessary to handle both
    the POSIX and GNU implementations of that function and perform
    widespread compatibility testing.  Such is left as an exercise for
    another day.
    
    Fixes #568
    

  • Properties

  • Git HTTP https://git.kmx.io/kc3-lang/libjpeg-turbo.git
    Git SSH git@git.kmx.io:kc3-lang/libjpeg-turbo.git
    Public access ? public
    Description

    Fork of libjpeg with SIMD

    Users
    thodg_m kc3_lang_org thodg_w www_kmx_io thodg_l thodg
    Tags