Mercurial > pidgin
annotate finch/getopt1.c @ 32797:aacfb71133cc
Fix a possible MSN remote crash
Incoming messages with certain characters or character encodings
can cause clients to crash. The fix is for the contents of all
incoming plaintext messages are converted to UTF-8 and validated
before used.
This was reported to us by Fabian Yamaguchi and this patch was written
by Elliott Sales de Andrade (maybe with small, insignificant changes by me)
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Mon, 07 May 2012 03:18:08 +0000 |
parents | a8cc50c2279f |
children |
rev | line source |
---|---|
15817 | 1 /* getopt_long and getopt_long_only entry points for GNU getopt. |
15870
66dff3dfdea6
Re-sed the copyright notices so they don't all talk about Purple.
Richard Laager <rlaager@wiktel.com>
parents:
15822
diff
changeset
|
2 Finch is the legal property of its developers, whose names are too numerous |
15817 | 3 to list here. Please refer to the COPYRIGHT file distributed with this |
4 source distribution. | |
5 | |
6 This program is free software; you can redistribute it and/or modify it | |
7 under the terms of the GNU General Public License as published by the | |
8 Free Software Foundation; either version 2, or (at your option) any | |
9 later version. | |
10 | |
11 This program is distributed in the hope that it will be useful, | |
12 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 GNU General Public License for more details. | |
15 | |
16 You should have received a copy of the GNU General Public License | |
17 along with this program; if not, write to the Free Software | |
18 Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ | |
19 | |
20 #ifdef HAVE_CONFIG_H | |
21 #include "config.h" | |
22 #endif | |
23 | |
24 #include "getopt.h" | |
25 | |
26 #if !__STDC__ && !defined(const) && IN_GCC | |
27 #define const | |
28 #endif | |
29 | |
30 #include <stdio.h> | |
31 | |
32 /* Comment out all this code if we are using the GNU C Library, and are not | |
33 actually compiling the library itself. This code is part of the GNU C | |
34 Library, but also included in many other GNU distributions. Compiling | |
35 and linking in this code is a waste when using the GNU C library | |
36 (especially if it is a shared library). Rather than having every GNU | |
37 program understand `configure --with-gnu-libc' and omit the object files, | |
38 it is simpler to just do this in the source for each such file. */ | |
39 | |
40 #if defined (_LIBC) || !defined (__GNU_LIBRARY__) | |
41 | |
42 | |
43 /* This needs to come after some library #include | |
44 to get __GNU_LIBRARY__ defined. */ | |
45 #ifdef __GNU_LIBRARY__ | |
46 #include <stdlib.h> | |
47 #else | |
48 char *getenv (); | |
49 #endif | |
50 | |
51 #ifndef NULL | |
52 #define NULL 0 | |
53 #endif | |
54 | |
55 int | |
56 getopt_long (argc, argv, options, long_options, opt_index) | |
57 int argc; | |
58 char *const *argv; | |
59 const char *options; | |
60 const struct option *long_options; | |
61 int *opt_index; | |
62 { | |
63 return _getopt_internal (argc, argv, options, long_options, opt_index, 0); | |
64 } | |
65 | |
66 /* Like getopt_long, but '-' as well as '--' can indicate a long option. | |
67 If an option that starts with '-' (not '--') doesn't match a long option, | |
68 but does match a short option, it is parsed as a short option | |
69 instead. */ | |
70 | |
71 int | |
72 getopt_long_only (argc, argv, options, long_options, opt_index) | |
73 int argc; | |
74 char *const *argv; | |
75 const char *options; | |
76 const struct option *long_options; | |
77 int *opt_index; | |
78 { | |
79 return _getopt_internal (argc, argv, options, long_options, opt_index, 1); | |
80 } | |
81 | |
82 | |
83 #endif /* _LIBC or not __GNU_LIBRARY__. */ | |
31086
a8cc50c2279f
Remove trailing whitespace
Richard Laager <rlaager@wiktel.com>
parents:
15870
diff
changeset
|
84 |
15817 | 85 #ifdef TEST |
86 | |
87 #include <stdio.h> | |
88 | |
89 int | |
90 main (argc, argv) | |
91 int argc; | |
92 char **argv; | |
93 { | |
94 int c; | |
95 int digit_optind = 0; | |
96 | |
97 while (1) | |
98 { | |
99 int this_option_optind = optind ? optind : 1; | |
100 int option_index = 0; | |
101 static struct option long_options[] = | |
102 { | |
103 {"add", 1, 0, 0}, | |
104 {"append", 0, 0, 0}, | |
105 {"delete", 1, 0, 0}, | |
106 {"verbose", 0, 0, 0}, | |
107 {"create", 0, 0, 0}, | |
108 {"file", 1, 0, 0}, | |
109 {0, 0, 0, 0} | |
110 }; | |
111 | |
112 c = getopt_long (argc, argv, "abc:d:0123456789", | |
113 long_options, &option_index); | |
114 if (c == EOF) | |
115 break; | |
116 | |
117 switch (c) | |
118 { | |
119 case 0: | |
120 printf ("option %s", long_options[option_index].name); | |
121 if (optarg) | |
122 printf (" with arg %s", optarg); | |
123 printf ("\n"); | |
124 break; | |
125 | |
126 case '0': | |
127 case '1': | |
128 case '2': | |
129 case '3': | |
130 case '4': | |
131 case '5': | |
132 case '6': | |
133 case '7': | |
134 case '8': | |
135 case '9': | |
136 if (digit_optind != 0 && digit_optind != this_option_optind) | |
137 printf ("digits occur in two different argv-elements.\n"); | |
138 digit_optind = this_option_optind; | |
139 printf ("option %c\n", c); | |
140 break; | |
141 | |
142 case 'a': | |
143 printf ("option a\n"); | |
144 break; | |
145 | |
146 case 'b': | |
147 printf ("option b\n"); | |
148 break; | |
149 | |
150 case 'c': | |
151 printf ("option c with value `%s'\n", optarg); | |
152 break; | |
153 | |
154 case 'd': | |
155 printf ("option d with value `%s'\n", optarg); | |
156 break; | |
157 | |
158 case '?': | |
159 break; | |
160 | |
161 default: | |
162 printf ("?? getopt returned character code 0%o ??\n", c); | |
163 } | |
164 } | |
165 | |
166 if (optind < argc) | |
167 { | |
168 printf ("non-option ARGV-elements: "); | |
169 while (optind < argc) | |
170 printf ("%s ", argv[optind++]); | |
171 printf ("\n"); | |
172 } | |
173 | |
174 exit (0); | |
175 } | |
176 | |
177 #endif /* TEST */ |