ports/misc/mc/files/patch-src-user.c
Max Khon 694ecd186a - Fix CAN-2004-0226, CAN-2004-0231, CAN-2004-0232.
- Do not use :: in patch file names.
- Patch for CAN-2003-1023 is now contained in patch-vfs-direntry.c.
- Bump PORTREVISION.

Submitted by:	Jakub Jelinek <jakub@redhat.com>
2004-06-14 20:56:00 +00:00

183 lines
4.9 KiB
C

--- src/user.c.orig Fri Nov 29 09:03:53 2002
+++ src/user.c Tue Jun 15 03:15:09 2004
@@ -138,19 +138,14 @@
}
/* Copy the variable name */
- var_name = g_malloc (dots - p);
- strncpy (var_name, p+4, dots-2 - (p+3));
- var_name [dots-2 - (p+3)] = 0;
-
+ var_name = g_strndup (p + 4, dots - p - 5);
value = getenv (var_name);
g_free (var_name);
if (value){
*v = g_strdup (value);
return q-p;
}
- var_name = g_malloc (q - dots + 1);
- strncpy (var_name, dots, q - dots + 1);
- var_name [q-dots] = 0;
+ var_name = g_strndup (dots, q - dots);
*v = var_name;
return q-p;
}
@@ -300,13 +295,15 @@
/* Copies a whitespace separated argument from p to arg. Returns the
point after argument. */
-static char *extract_arg (char *p, char *arg)
+static char *extract_arg (char *p, char *arg, size_t size)
{
while (*p && (*p == ' ' || *p == '\t' || *p == '\n'))
p++;
/* support quote space .mnu */
- while (*p && (*p != ' ' || *(p-1) == '\\') && *p != '\t' && *p != '\n')
+ while (size > 1 && *p && (*p != ' ' || *(p-1) == '\\') && *p != '\t' && *p != '\n') {
*arg++ = *p++;
+ size--;
+ }
*arg = 0;
if (!*p || *p == '\n')
p --;
@@ -389,29 +386,29 @@
p--;
break;
case 'f': /* file name pattern */
- p = extract_arg (p, arg);
+ p = extract_arg (p, arg, sizeof (arg));
*condition = panel && regexp_match (arg, panel->dir.list [panel->selected].fname, match_file);
break;
case 'y': /* syntax pattern */
if (edit_widget && edit_widget->syntax_type) {
- p = extract_arg (p, arg);
+ p = extract_arg (p, arg, sizeof (arg));
*condition = panel &&
regexp_match (arg, edit_widget->syntax_type, match_normal);
}
break;
case 'd':
- p = extract_arg (p, arg);
+ p = extract_arg (p, arg, sizeof (arg));
*condition = panel && regexp_match (arg, panel->cwd, match_file);
break;
case 't':
- p = extract_arg (p, arg);
+ p = extract_arg (p, arg, sizeof (arg));
*condition = panel && test_type (panel, arg);
break;
case 'x': /* executable */
{
struct stat status;
- p = extract_arg (p, arg);
+ p = extract_arg (p, arg, sizeof (arg));
if (stat (arg, &status) == 0)
*condition = is_exe (status.st_mode);
else
@@ -431,50 +428,43 @@
static void
debug_out (char *start, char *end, int cond)
{
- static char msg [256];
+ static char *msg;
int len;
if (start == NULL && end == NULL){
- if (cond == 0){
- /* Init */
- msg [0] = 0;
- } else {
- /* Show output */
- if (!debug_flag)
- return;
+ /* Show output */
+ if (debug_flag && msg) {
len = strlen (msg);
if (len)
msg [len - 1] = 0;
message (0, _(" Debug "), "%s", msg);
- debug_flag = 0;
}
+ debug_flag = 0;
+ g_free (msg);
+ msg = NULL;
} else {
+ char *type, *p;
+
/* Save debug info for later output */
if (!debug_flag)
return;
/* Save the result of the condition */
if (debug_error){
- strcat (msg, _(" ERROR: "));
+ type = _(" ERROR: ");
debug_error = 0;
}
else if (cond)
- strcat (msg, _(" True: "));
+ type = _(" True: ");
else
- strcat (msg, _(" False: "));
- /* Copy condition statement */
- len = strlen (msg);
- if (end == NULL){
- /* Copy one character */
- msg [len] = *start;
- msg [len + 1] = 0;
- } else {
- /* Copy many characters */
- while (start < end){
- msg [len++] = *start++;
- }
- msg [len] = 0;
- }
- strcat (msg, " \n");
+ type = _(" False: ");
+ /* This is for debugging, don't need to be super efficient. */
+ if (end == NULL)
+ p = g_strdup_printf ("%s%s%c \n", msg ? msg : "", type, *start);
+ else
+ p = g_strdup_printf ("%s%s%.*s \n", msg ? msg : "", type,
+ (int) (end - start), start);
+ g_free (msg);
+ msg = p;
}
}
@@ -486,8 +476,6 @@
char operator;
char *debug_start, *debug_end;
- /* Init debugger */
- debug_out (NULL, NULL, 0);
/* Repeat till end of line */
while (*p && *p != '\n') {
/* support quote space .mnu */
@@ -578,6 +566,8 @@
break;
while (*commands == ' ' || *commands == '\t')
commands++;
+ if (*commands == '0')
+ break;
}
col++;
if (*commands == '\n')
@@ -734,7 +724,7 @@
} else if (*p == '+'){
if (*(p+1) == '='){
/* Combined adding and default */
- p = test_line (edit_widget, p, &accept_entry);
+ p = test_line (edit_widget, p + 1, &accept_entry);
if (selected == 0 && accept_entry)
selected = menu_lines;
} else {
@@ -744,7 +734,7 @@
} else if (*p == '='){
if (*(p+1) == '+'){
/* Combined adding and default */
- p = test_line (edit_widget, p, &accept_entry);
+ p = test_line (edit_widget, p + 1, &accept_entry);
if (selected == 0 && accept_entry)
selected = menu_lines;
} else {