]> granicus.if.org Git - handbrake/commitdiff
libhb: fix snprintf compiler warnings
authorJohn Stebbins <jstebbins.hb@gmail.com>
Wed, 13 Jun 2018 17:11:30 +0000 (10:11 -0700)
committerJohn Stebbins <jstebbins.hb@gmail.com>
Wed, 13 Jun 2018 17:11:30 +0000 (10:11 -0700)
Our handling of temporary directory paths could truncate resulting
filenames.  This fixes the warnings and prevents possible truncation.

gtk/src/hb-backend.c
gtk/src/preview.c
libhb/encavcodec.c
libhb/enctheora.c
libhb/encx264.c
libhb/encx265.c
libhb/hb.c
libhb/ports.c
libhb/ports.h

index 8a9ed99b0e491d3ef18d45a0d5b836eff2e17765..3143eb8c44d27e298aa883379a29d52b21cb2673 100644 (file)
@@ -1093,24 +1093,20 @@ hb_handle_t* ghb_live_handle(void)
     return h_live;
 }
 
-extern void hb_get_temporary_directory(char path[512]);
-
 gchar*
 ghb_get_tmp_dir()
 {
-    char dir[512];
-
-    hb_get_temporary_directory(dir);
-    return g_strdup(dir);
+    return hb_get_temporary_directory();
 }
 
 void
 ghb_hb_cleanup(gboolean partial)
 {
-    char dir[512];
+    char * dir;
 
-    hb_get_temporary_directory(dir);
+    dir = hb_get_temporary_directory();
     del_tree(dir, !partial);
+    free(dir);
 }
 
 gint
index 3a28aa4bd3fe8d27d7311ddaa8a8d8778745d09a..4537f96449a65f3772f66ababc60f8dd709c75cb 100644 (file)
@@ -650,6 +650,7 @@ live_preview_start_cb(GtkWidget *xwidget, signal_user_data_t *ud)
 
     tmp_dir = ghb_get_tmp_dir();
     name = g_strdup_printf("%s/live%02d", tmp_dir, ud->preview->frame);
+    free(tmp_dir);
     if (ud->preview->current)
         g_free(ud->preview->current);
     ud->preview->current = name;
index 805365ac2b783a739643b79aee707befd9ff3af7..ee914faba15c20ac09776af3c3aff9ea7f6f4edf 100644 (file)
@@ -368,17 +368,18 @@ int encavcodecInit( hb_work_object_t * w, hb_job_t * job )
     if( job->pass_id == HB_PASS_ENCODE_1ST ||
         job->pass_id == HB_PASS_ENCODE_2ND )
     {
-        char filename[1024]; memset( filename, 0, 1024 );
-        hb_get_tempory_filename( job->h, filename, "ffmpeg.log" );
+        char * filename = hb_get_temporary_filename("ffmpeg.log");
 
         if( job->pass_id == HB_PASS_ENCODE_1ST )
         {
             pv->file = hb_fopen(filename, "wb");
-            if (!pv->file) {
+            if (!pv->file)
+            {
                 if (strerror_r(errno, reason, 79) != 0)
                     strcpy(reason, "unknown -- strerror_r() failed");
 
                 hb_error("encavcodecInit: Failed to open %s (reason: %s)", filename, reason);
+                free(filename);
                 ret = 1;
                 goto done;
             }
@@ -395,6 +396,7 @@ int encavcodecInit( hb_work_object_t * w, hb_job_t * job )
                     strcpy(reason, "unknown -- strerror_r() failed");
 
                 hb_error("encavcodecInit: Failed to open %s (reason: %s)", filename, reason);
+                free(filename);
                 ret = 1;
                 goto done;
             }
@@ -412,6 +414,7 @@ int encavcodecInit( hb_work_object_t * w, hb_job_t * job )
                         strcpy(reason, "unknown -- strerror_r() failed");
 
                     hb_error( "encavcodecInit: Failed to read %s (reason: %s)" , filename, reason);
+                    free(filename);
                     ret = 1;
                     fclose( pv->file );
                     pv->file = NULL;
@@ -424,12 +427,14 @@ int encavcodecInit( hb_work_object_t * w, hb_job_t * job )
             context->flags    |= AV_CODEC_FLAG_PASS2;
             context->stats_in  = log;
         }
+        free(filename);
     }
 
     if (hb_avcodec_open(context, codec, &av_opts, HB_FFMPEG_THREADS_AUTO))
     {
         hb_log( "encavcodecInit: avcodec_open failed" );
-        return 1;
+        ret = 1;
+        goto done;
     }
 
     if (job->pass_id == HB_PASS_ENCODE_1ST &&
index 3a78d722897648ff51c48a5a08667bb1b72e2948..85c295b0020642c4cb06e11e23c36f26e5404dc0 100644 (file)
@@ -47,9 +47,8 @@ int enctheoraInit( hb_work_object_t * w, hb_job_t * job )
     if( job->pass_id == HB_PASS_ENCODE_1ST ||
         job->pass_id == HB_PASS_ENCODE_2ND )
     {
-        char filename[1024];
-        memset( filename, 0, 1024 );
-        hb_get_tempory_filename( job->h, filename, "theroa.log" );
+        char * filename;
+        filename = hb_get_temporary_filename("theroa.log");
         if ( job->pass_id == HB_PASS_ENCODE_1ST )
         {
             pv->file = hb_fopen(filename, "wb");
@@ -58,6 +57,7 @@ int enctheoraInit( hb_work_object_t * w, hb_job_t * job )
         {
             pv->file = hb_fopen(filename, "rb");
         }
+        free(filename);
     }
 
     th_info ti;
index 638cf4ff78d103cb6c362db0153cfdbc89fc8520..6df1f910971617dee4bab0f58723ceff707967ca 100644 (file)
@@ -38,7 +38,7 @@ struct hb_work_private_s
 
     hb_chapter_queue_t * chapter_queue;
 
-    char                 filename[1024];
+    char               * filename;
 
     // Multiple bit-depth
     const x264_api_t *   api;
@@ -520,8 +520,7 @@ int encx264Init( hb_work_object_t * w, hb_job_t * job )
         if( job->pass_id == HB_PASS_ENCODE_1ST ||
             job->pass_id == HB_PASS_ENCODE_2ND )
         {
-            memset( pv->filename, 0, 1024 );
-            hb_get_tempory_filename( job->h, pv->filename, "x264.log" );
+            pv->filename = hb_get_temporary_filename("x264.log");
         }
         switch( job->pass_id )
         {
@@ -637,6 +636,7 @@ void encx264Close( hb_work_object_t * w )
     hb_chapter_queue_close(&pv->chapter_queue);
 
     pv->api->encoder_close( pv->x264 );
+    free( pv->filename );
     free( pv );
     w->private_data = NULL;
 }
index 1f66228fde47fa506d34bf95d8205508f785e43c..cce69e330ccad3e42b81dad2ecde89ff004f21f5 100644 (file)
@@ -53,7 +53,7 @@ struct hb_work_private_s
         int64_t          duration;
     } frame_info[FRAME_INFO_SIZE];
 
-    char                 csvfn[1024];
+    char               * csvfn;
 
     // Multiple bit-depth
     const x265_api     * api;
@@ -255,15 +255,17 @@ int encx265Init(hb_work_object_t *w, hb_job_t *job)
         if (job->pass_id == HB_PASS_ENCODE_1ST ||
             job->pass_id == HB_PASS_ENCODE_2ND)
         {
-            char stats_file[1024] = "";
-            char pass[2];
+            char * stats_file;
+            char   pass[2];
             snprintf(pass, sizeof(pass), "%d", job->pass_id);
-            hb_get_tempory_filename(job->h, stats_file, "x265.log");
+            stats_file = hb_get_temporary_filename("x265.log");
             if (param_parse(pv, param, "stats", stats_file) ||
                 param_parse(pv, param, "pass", pass))
             {
+                free(stats_file);
                 goto fail;
             }
+            free(stats_file);
             if (job->pass_id == HB_PASS_ENCODE_1ST)
             {
                 char slowfirstpass[2];
@@ -278,17 +280,16 @@ int encx265Init(hb_work_object_t *w, hb_job_t *job)
     }
 
     /* statsfile (but not 2-pass) */
-    memset(pv->csvfn, 0, sizeof(pv->csvfn));
     if (param->logLevel >= X265_LOG_DEBUG)
     {
         if (param->csvfn == NULL)
         {
-            hb_get_tempory_filename(job->h, pv->csvfn, "x265.csv");
-            param->csvfn = pv->csvfn;
+            pv->csvfn = hb_get_temporary_filename("x265.csv");
+            param->csvfn = strdup(pv->csvfn);
         }
         else
         {
-            strncpy(pv->csvfn, param->csvfn, sizeof(pv->csvfn));
+            pv->csvfn = strdup(param->csvfn);
         }
     }
 
@@ -354,6 +355,7 @@ void encx265Close(hb_work_object_t *w)
 
     pv->api->param_free(pv->param);
     pv->api->encoder_close(pv->x265);
+    free(pv->csvfn);
     free(pv);
     w->private_data = NULL;
 }
index c63e0e069f1ce74b9f7118fc6e5930ef0d8c5c9a..e4b0e11108b9de6ec1a99115dffd3be4411c4378 100644 (file)
@@ -308,17 +308,20 @@ int hb_get_build( hb_handle_t * h )
  */
 void hb_remove_previews( hb_handle_t * h )
 {
-    char            filename[1024];
-    char            dirname[1024];
+    char          * filename;
+    char          * dirname;
     hb_title_t    * title;
     int             i, count, len;
     DIR           * dir;
     struct dirent * entry;
 
-    memset( dirname, 0, 1024 );
-    hb_get_temporary_directory( dirname );
+    dirname = hb_get_temporary_directory();
     dir = opendir( dirname );
-    if (dir == NULL) return;
+    if (dir == NULL)
+    {
+        free(dirname);
+        return;
+    }
 
     count = hb_list_count( h->title_set.list_title );
     while( ( entry = readdir( dir ) ) )
@@ -330,15 +333,20 @@ void hb_remove_previews( hb_handle_t * h )
         for( i = 0; i < count; i++ )
         {
             title = hb_list_item( h->title_set.list_title, i );
+            filename = hb_strdup_printf("%d_%d", h->id, title->index);
             len = snprintf( filename, 1024, "%d_%d", h->id, title->index );
             if (strncmp(entry->d_name, filename, len) == 0)
             {
-                snprintf( filename, 1024, "%s/%s", dirname, entry->d_name );
+                free(filename);
+                filename = hb_strdup_printf("%s/%s", dirname, entry->d_name);
                 unlink( filename );
+                free(filename);
                 break;
             }
+            free(filename);
         }
     }
+    free(dirname);
     closedir( dir );
 }
 
@@ -444,19 +452,21 @@ hb_title_set_t * hb_get_title_set( hb_handle_t * h )
 int hb_save_preview( hb_handle_t * h, int title, int preview, hb_buffer_t *buf )
 {
     FILE * file;
-    char   filename[1024];
+    char * filename;
     char   reason[80];
 
-    hb_get_tempory_filename( h, filename, "%d_%d_%d",
-                             hb_get_instance_id(h), title, preview );
+    filename = hb_get_temporary_filename("%d_%d_%d", hb_get_instance_id(h),
+                                         title, preview );
 
     file = hb_fopen(filename, "wb");
-    if( !file )
+    if (file == NULL)
     {
         if (strerror_r(errno, reason, 79) != 0)
             strcpy(reason, "unknown -- strerror_r() failed");
 
-        hb_error( "hb_save_preview: Failed to open %s (reason: %s)", filename, reason );
+        hb_error("hb_save_preview: Failed to open %s (reason: %s)",
+                 filename, reason);
+        free(filename);
         return -1;
     }
 
@@ -477,7 +487,8 @@ int hb_save_preview( hb_handle_t * h, int title, int preview, hb_buffer_t *buf )
                     if (strerror_r(errno, reason, 79) != 0)
                         strcpy(reason, "unknown -- strerror_r() failed");
 
-                    hb_error( "hb_save_preview: Failed to write line %d to %s (reason: %s). Preview will be incomplete.",
+                    hb_error( "hb_save_preview: Failed to write line %d to %s "
+                              "(reason: %s). Preview will be incomplete.",
                               hh, filename, reason );
                     goto done;
                 }
@@ -487,6 +498,7 @@ int hb_save_preview( hb_handle_t * h, int title, int preview, hb_buffer_t *buf )
     }
 
 done:
+    free(filename);
     fclose( file );
 
     return 0;
@@ -495,19 +507,21 @@ done:
 hb_buffer_t * hb_read_preview(hb_handle_t * h, hb_title_t *title, int preview)
 {
     FILE * file;
-    char   filename[1024];
+    char * filename;
     char   reason[80];
 
-    hb_get_tempory_filename(h, filename, "%d_%d_%d",
-                            hb_get_instance_id(h), title->index, preview);
+    filename = hb_get_temporary_filename("%d_%d_%d", hb_get_instance_id(h),
+                                         title->index, preview);
 
     file = hb_fopen(filename, "rb");
-    if (!file)
+    if (file == NULL)
     {
         if (strerror_r(errno, reason, 79) != 0)
             strcpy(reason, "unknown -- strerror_r() failed");
 
-        hb_error( "hb_read_preview: Failed to open %s (reason: %s)", filename, reason );
+        hb_error("hb_read_preview: Failed to open %s (reason: %s)",
+                 filename, reason);
+        free(filename);
         return NULL;
     }
 
@@ -535,8 +549,9 @@ hb_buffer_t * hb_read_preview(hb_handle_t * h, hb_title_t *title, int preview)
                     if (strerror_r(errno, reason, 79) != 0)
                         strcpy(reason, "unknown -- strerror_r() failed");
 
-                    hb_error( "hb_read_preview: Failed to read line %d from %s (reason: %s). Preview will be incomplete.",
-                          hh, filename, reason );
+                    hb_error("hb_read_preview: Failed to read line %d from %s "
+                             "(reason: %s). Preview will be incomplete.",
+                             hh, filename, reason );
                     goto done;
                 }
             }
@@ -545,6 +560,7 @@ hb_buffer_t * hb_read_preview(hb_handle_t * h, hb_title_t *title, int preview)
     }
 
 done:
+    free(filename);
     fclose(file);
 
     return buf;
@@ -1703,33 +1719,33 @@ int hb_global_init()
  */
 void hb_global_close()
 {
-    char dirname[1024];
-    DIR * dir;
+    char          * dirname;
+    DIR           * dir;
     struct dirent * entry;
 
     hb_presets_free();
 
     /* Find and remove temp folder */
-    memset( dirname, 0, 1024 );
-    hb_get_temporary_directory( dirname );
+    dirname = hb_get_temporary_directory();
 
     dir = opendir( dirname );
     if (dir)
     {
         while( ( entry = readdir( dir ) ) )
         {
-            char filename[1024];
+            char * filename;
             if( entry->d_name[0] == '.' )
             {
                 continue;
             }
-            memset( filename, 0, 1024 );
-            snprintf( filename, 1023, "%s/%s", dirname, entry->d_name );
+            filename = hb_strdup_printf("%s/%s", dirname, entry->d_name);
             unlink( filename );
+            free(filename);
         }
         closedir( dir );
         rmdir( dirname );
     }
+    free(dirname);
 }
 
 /**
@@ -1741,15 +1757,15 @@ void hb_global_close()
 static void thread_func( void * _h )
 {
     hb_handle_t * h = (hb_handle_t *) _h;
-    char dirname[1024];
+    char * dirname;
 
     h->pid = getpid();
 
     /* Create folder for temporary files */
-    memset( dirname, 0, 1024 );
-    hb_get_temporary_directory( dirname );
+    dirname = hb_get_temporary_directory();
 
     hb_mkdir( dirname );
+    free(dirname);
 
     while( !h->die )
     {
index 5d71541abc955fb5b4942f6524a9ecad4f7e535a..ac08c368afcdf17ecd130bdcd29eb9f041fef29d 100644 (file)
@@ -598,17 +598,17 @@ void hb_get_user_config_filename( char name[1024], char *fmt, ... )
 /************************************************************************
  * Get a temporary directory for HB
  ***********************************************************************/
-void hb_get_temporary_directory( char path[512] )
+char * hb_get_temporary_directory()
 {
-    char base[512];
-    char *p;
+    char * path, * base, * p;
 
     /* Create the base */
 #if defined( SYS_CYGWIN ) || defined( SYS_MINGW )
-    int i_size = GetTempPath( 512, base );
-    if( i_size <= 0 || i_size >= 512 )
+    base = malloc(MAX_PATH);
+    int i_size = GetTempPath( MAX_PATH, base );
+    if( i_size <= 0 || i_size >= MAX_PATH )
     {
-        if( getcwd( base, 512 ) == NULL )
+        if( getcwd( base, MAX_PATH ) == NULL )
             strcpy( base, "c:" ); /* Bad fallback but ... */
     }
 
@@ -617,32 +617,39 @@ void hb_get_temporary_directory( char path[512] )
         *p = '/';
 #else
     if( (p = getenv( "TMPDIR" ) ) != NULL ||
-        (p = getenv( "TEMP" ) ) != NULL )
-        strcpy( base, p );
+        (p = getenv( "TEMP" ) )   != NULL )
+        base = strdup(p);
     else
-        strcpy( base, "/tmp" );
+        base = strdup("/tmp");
 #endif
     /* I prefer to remove evntual last '/' (for cygwin) */
     if( base[strlen(base)-1] == '/' )
         base[strlen(base)-1] = '\0';
 
-    snprintf(path, 512, "%s/hb.%d", base, (int)getpid());
+    path = hb_strdup_printf("%s/hb.%d", base, (int)getpid());
+    free(base);
+
+    return path;
 }
 
 /************************************************************************
  * Get a tempory filename for HB
  ***********************************************************************/
-void hb_get_tempory_filename( hb_handle_t * h, char name[1024],
-                              char *fmt, ... )
+char * hb_get_temporary_filename( char *fmt, ... )
 {
-    va_list args;
-
-    hb_get_temporary_directory( name );
-    strcat( name, "/" );
+    va_list   args;
+    char    * name, * path;
+    char    * dir = hb_get_temporary_directory();
 
     va_start( args, fmt );
-    vsnprintf( &name[strlen(name)], 1024 - strlen(name), fmt, args );
+    name = hb_strdup_vaprintf(fmt, args);
     va_end( args );
+
+    path = hb_strdup_printf("%s/%s", dir, name);
+    free(dir);
+    free(name);
+
+    return path;
 }
 
 /************************************************************************
index f664170a40fc231717cfb997e2a1f8d1c7933e03..6e78bea10852d57762ff6fe819e8c356c438015c 100644 (file)
@@ -83,6 +83,12 @@ int hb_stat(const char *path, hb_stat_t *sb);
 FILE * hb_fopen(const char *path, const char *mode);
 char * hb_strr_dir_sep(const char *path);
 
+/************************************************************************
+ * File utils
+ ***********************************************************************/
+char * hb_get_temporary_directory(void);
+char * hb_get_temporary_filename( char *fmt, ... );
+
 #ifdef __LIBHB__
 
 // Convert utf8 string to current code page.
@@ -95,13 +101,6 @@ char * hb_utf8_to_cp(const char *src);
  ***********************************************************************/
 int hb_dvd_region(char *device, int *region_mask);
 
-/************************************************************************
- * File utils
- ***********************************************************************/
-void hb_get_temporary_directory( char path[512] );
-void hb_get_tempory_filename( hb_handle_t *, char name[1024],
-                              char * fmt, ... );
-
 #if defined( SYS_DARWIN )
 int osx_get_user_config_directory( char path[512] );
 #endif