1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
Description: Inferior option handling leads to segfaults.
The sequential testing of command line options is easily
provoked into producing segmentation faults. Leaving an
option whithout the expected argument is sufficient.
.
Argument sanitation and short circuits in the loop
constitute a satisfactory cure.
Author: Mats Erik Andersson <debian@gisladisker.se>
Forwarded: yes
Last-Update: 2010-12-09
diff -Naurp rgbpaint-0.8.7.orig/src/main.c rgbpaint-0.8.7/src/main.c
--- rgbpaint-0.8.7.orig/src/main.c
+++ rgbpaint-0.8.7/src/main.c
@@ -171,61 +171,101 @@ int main( int argc, char *argv[] )
{
if ( strcmp(argv[i], "-svg") == 0 ) // Set SVG directory
{
- file_arg_start+=2;
- files_passed-=2;
+ file_arg_start+=1;
+ files_passed-=1;
i++;
- svg_dir = argv[i];
+ if ((i < argc) && argv[i] && *argv[i]) {
+ /* An argument does indeed exist. */
+ ++file_arg_start;
+ --files_passed;
+ svg_dir = argv[i];
+ }
+ continue;
}
if ( strcmp(argv[i], "-thumb") == 0 ) // Set thumbnail size
{
- file_arg_start+=2;
- files_passed-=2;
+ file_arg_start+=1;
+ files_passed-=1;
i++;
- sscanf( argv[i], "%i", &thumb_size );
- if ( thumb_size<32 || thumb_size>256 )
- thumb_size = 40; // Ensure sanity
+ if ((i < argc) && argv[i] && *argv[i]) {
+ /* An argument does indeed exist. */
+ ++file_arg_start;
+ --files_passed;
+ sscanf( argv[i], "%i", &thumb_size );
+ if ( thumb_size<32 || thumb_size>256 )
+ thumb_size = 40; // Ensure sanity
+ }
+ continue;
}
if ( strcmp(argv[i], "-stamps") == 0 ) // Files are stamps
{
file_arg_start++;
files_passed--;
stamp_start = i+1;
+ continue;
}
if ( strcmp(argv[i], "-d") == 0 ) // Set the default directory
{
- file_arg_start += 2;
- files_passed -= 2;
+ file_arg_start += 1;
+ files_passed -= 1;
i++;
- fs_set_dir(argv[i]);
+ if ((i < argc) && argv[i] && *argv[i]) {
+ /* An argument does indeed exist. */
+ ++file_arg_start;
+ --files_passed;
+ fs_set_dir(argv[i]);
+ }
+ continue;
}
if ( strcmp(argv[i], "-s") == 0 ) // Screenshot
{
file_arg_start++;
files_passed--;
get_screenshot = TRUE;
+ continue;
}
if ( strcmp(argv[i], "-u") == 0 ) // Undo memory limit
{
- file_arg_start+=2;
- files_passed-=2;
+ file_arg_start+=1;
+ files_passed-=1;
i++;
- sscanf( argv[i], "%i", &mem_undo_limit );
- if ( mem_undo_limit<1 || mem_undo_limit>500 )
- mem_undo_limit = 32; // Ensure sanity
+ if ((i < argc) && argv[i] && *argv[i]) {
+ /* An argument does indeed exist. */
+ ++file_arg_start;
+ --files_passed;
+ sscanf( argv[i], "%i", &mem_undo_limit );
+ if ( mem_undo_limit<1 || mem_undo_limit>500 )
+ mem_undo_limit = 32; // Ensure sanity
+ }
+ continue;
}
#ifndef WIN32
if ( strcmp(argv[i], "-browserWindow") == 0 )
{
- file_arg_start+=2;
- files_passed-=2;
+ file_arg_start+=1;
+ files_passed-=1;
i++;
- sscanf( argv[i], "%i", &olpc_widget );
+ if ((i < argc) && argv[i] && *argv[i]) {
+ /* An argument does indeed exist. */
+ ++file_arg_start;
+ --files_passed;
+ sscanf( argv[i], "%i", &olpc_widget );
+ }
+ continue;
}
if ( strcmp(argv[i], "sugarPipe") == 0 )
{
- file_arg_start+=2;
- files_passed-=2;
+ file_arg_start+=1;
+ files_passed-=1;
i++;
+ if (!( (i < argc) && argv[i] && *argv[i] )) {
+ /* Invalid argument. Cancel. */
+ continue;
+ }
+
+ ++file_arg_start;
+ --files_passed;
+
fh = open(argv[i], O_RDWR);
// Open socket file to grab messages from Sugar
|