You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
584 lines
14 KiB
584 lines
14 KiB
commit bc0d18d873abf2cda6842ad8bb4df2a31dc0fbac |
|
Author: Siddhesh Poyarekar <siddhesh@sourceware.org> |
|
Date: Tue Aug 3 21:29:23 2021 +0530 |
|
|
|
gai_init: Avoid jumping from if condition to its else counterpart |
|
|
|
Clean up another antipattern where code flows from an if condition to |
|
its else counterpart with a goto. |
|
|
|
Most of the change in this patch is whitespace-only; a `git diff -b` |
|
ought to show the actual logic changes. |
|
|
|
Signed-off-by: Siddhesh Poyarekar <siddhesh@sourceware.org> |
|
Reviewed-by: DJ Delorie <dj@redhat.com> |
|
|
|
diff --git a/sysdeps/posix/getaddrinfo.c b/sysdeps/posix/getaddrinfo.c |
|
index 3bf9a8bae16a5b02..1635a09837351068 100644 |
|
--- a/sysdeps/posix/getaddrinfo.c |
|
+++ b/sysdeps/posix/getaddrinfo.c |
|
@@ -1933,142 +1933,122 @@ gaiconf_init (void) |
|
bool scopelist_nullbits = false; |
|
|
|
FILE *fp = fopen (GAICONF_FNAME, "rce"); |
|
- if (fp != NULL) |
|
+ if (fp == NULL) |
|
+ goto no_file; |
|
+ |
|
+ struct __stat64_t64 st; |
|
+ if (__fstat64_time64 (fileno (fp), &st) != 0) |
|
{ |
|
- struct __stat64_t64 st; |
|
- if (__fstat64_time64 (fileno (fp), &st) != 0) |
|
- { |
|
- fclose (fp); |
|
- goto no_file; |
|
- } |
|
+ fclose (fp); |
|
+ goto no_file; |
|
+ } |
|
|
|
- char *line = NULL; |
|
- size_t linelen = 0; |
|
+ char *line = NULL; |
|
+ size_t linelen = 0; |
|
|
|
- __fsetlocking (fp, FSETLOCKING_BYCALLER); |
|
+ __fsetlocking (fp, FSETLOCKING_BYCALLER); |
|
|
|
- while (!feof_unlocked (fp)) |
|
- { |
|
- ssize_t n = __getline (&line, &linelen, fp); |
|
- if (n <= 0) |
|
- break; |
|
+ while (!feof_unlocked (fp)) |
|
+ { |
|
+ ssize_t n = __getline (&line, &linelen, fp); |
|
+ if (n <= 0) |
|
+ break; |
|
|
|
- /* Handle comments. No escaping possible so this is easy. */ |
|
- char *cp = strchr (line, '#'); |
|
- if (cp != NULL) |
|
- *cp = '\0'; |
|
+ /* Handle comments. No escaping possible so this is easy. */ |
|
+ char *cp = strchr (line, '#'); |
|
+ if (cp != NULL) |
|
+ *cp = '\0'; |
|
|
|
- cp = line; |
|
- while (isspace (*cp)) |
|
- ++cp; |
|
+ cp = line; |
|
+ while (isspace (*cp)) |
|
+ ++cp; |
|
|
|
- char *cmd = cp; |
|
- while (*cp != '\0' && !isspace (*cp)) |
|
- ++cp; |
|
- size_t cmdlen = cp - cmd; |
|
+ char *cmd = cp; |
|
+ while (*cp != '\0' && !isspace (*cp)) |
|
+ ++cp; |
|
+ size_t cmdlen = cp - cmd; |
|
|
|
- if (*cp != '\0') |
|
- *cp++ = '\0'; |
|
- while (isspace (*cp)) |
|
- ++cp; |
|
+ if (*cp != '\0') |
|
+ *cp++ = '\0'; |
|
+ while (isspace (*cp)) |
|
+ ++cp; |
|
|
|
- char *val1 = cp; |
|
- while (*cp != '\0' && !isspace (*cp)) |
|
- ++cp; |
|
- size_t val1len = cp - cmd; |
|
+ char *val1 = cp; |
|
+ while (*cp != '\0' && !isspace (*cp)) |
|
+ ++cp; |
|
+ size_t val1len = cp - cmd; |
|
|
|
- /* We always need at least two values. */ |
|
- if (val1len == 0) |
|
- continue; |
|
+ /* We always need at least two values. */ |
|
+ if (val1len == 0) |
|
+ continue; |
|
|
|
- if (*cp != '\0') |
|
- *cp++ = '\0'; |
|
- while (isspace (*cp)) |
|
- ++cp; |
|
+ if (*cp != '\0') |
|
+ *cp++ = '\0'; |
|
+ while (isspace (*cp)) |
|
+ ++cp; |
|
|
|
- char *val2 = cp; |
|
- while (*cp != '\0' && !isspace (*cp)) |
|
- ++cp; |
|
+ char *val2 = cp; |
|
+ while (*cp != '\0' && !isspace (*cp)) |
|
+ ++cp; |
|
|
|
- /* Ignore the rest of the line. */ |
|
- *cp = '\0'; |
|
+ /* Ignore the rest of the line. */ |
|
+ *cp = '\0'; |
|
|
|
- switch (cmdlen) |
|
+ switch (cmdlen) |
|
+ { |
|
+ case 5: |
|
+ if (strcmp (cmd, "label") == 0) |
|
{ |
|
- case 5: |
|
- if (strcmp (cmd, "label") == 0) |
|
+ if (!add_prefixlist (&labellist, &nlabellist, |
|
+ &labellist_nullbits, val1, val2, &cp)) |
|
{ |
|
- if (!add_prefixlist (&labellist, &nlabellist, |
|
- &labellist_nullbits, val1, val2, &cp)) |
|
- { |
|
- free (line); |
|
- fclose (fp); |
|
- goto no_file; |
|
- } |
|
+ free (line); |
|
+ fclose (fp); |
|
+ goto no_file; |
|
} |
|
- break; |
|
+ } |
|
+ break; |
|
|
|
- case 6: |
|
- if (strcmp (cmd, "reload") == 0) |
|
- { |
|
- gaiconf_reload_flag = strcmp (val1, "yes") == 0; |
|
- if (gaiconf_reload_flag) |
|
- gaiconf_reload_flag_ever_set = 1; |
|
- } |
|
- break; |
|
+ case 6: |
|
+ if (strcmp (cmd, "reload") == 0) |
|
+ { |
|
+ gaiconf_reload_flag = strcmp (val1, "yes") == 0; |
|
+ if (gaiconf_reload_flag) |
|
+ gaiconf_reload_flag_ever_set = 1; |
|
+ } |
|
+ break; |
|
|
|
- case 7: |
|
- if (strcmp (cmd, "scopev4") == 0) |
|
+ case 7: |
|
+ if (strcmp (cmd, "scopev4") == 0) |
|
+ { |
|
+ struct in6_addr prefix; |
|
+ unsigned long int bits; |
|
+ unsigned long int val; |
|
+ char *endp; |
|
+ |
|
+ bits = 32; |
|
+ __set_errno (0); |
|
+ cp = strchr (val1, '/'); |
|
+ if (cp != NULL) |
|
+ *cp++ = '\0'; |
|
+ if (inet_pton (AF_INET6, val1, &prefix)) |
|
{ |
|
- struct in6_addr prefix; |
|
- unsigned long int bits; |
|
- unsigned long int val; |
|
- char *endp; |
|
- |
|
- bits = 32; |
|
- __set_errno (0); |
|
- cp = strchr (val1, '/'); |
|
- if (cp != NULL) |
|
- *cp++ = '\0'; |
|
- if (inet_pton (AF_INET6, val1, &prefix)) |
|
- { |
|
- bits = 128; |
|
- if (IN6_IS_ADDR_V4MAPPED (&prefix) |
|
- && (cp == NULL |
|
- || (bits = strtoul (cp, &endp, 10)) != ULONG_MAX |
|
- || errno != ERANGE) |
|
- && *endp == '\0' |
|
- && bits >= 96 |
|
- && bits <= 128 |
|
- && ((val = strtoul (val2, &endp, 10)) != ULONG_MAX |
|
- || errno != ERANGE) |
|
- && *endp == '\0' |
|
- && val <= INT_MAX) |
|
- { |
|
- if (!add_scopelist (&scopelist, &nscopelist, |
|
- &scopelist_nullbits, &prefix, |
|
- bits, val)) |
|
- { |
|
- free (line); |
|
- fclose (fp); |
|
- goto no_file; |
|
- } |
|
- } |
|
- } |
|
- else if (inet_pton (AF_INET, val1, &prefix.s6_addr32[3]) |
|
- && (cp == NULL |
|
- || (bits = strtoul (cp, &endp, 10)) != ULONG_MAX |
|
- || errno != ERANGE) |
|
- && *endp == '\0' |
|
- && bits <= 32 |
|
- && ((val = strtoul (val2, &endp, 10)) != ULONG_MAX |
|
- || errno != ERANGE) |
|
- && *endp == '\0' |
|
- && val <= INT_MAX) |
|
+ bits = 128; |
|
+ if (IN6_IS_ADDR_V4MAPPED (&prefix) |
|
+ && (cp == NULL |
|
+ || (bits = strtoul (cp, &endp, 10)) != ULONG_MAX |
|
+ || errno != ERANGE) |
|
+ && *endp == '\0' |
|
+ && bits >= 96 |
|
+ && bits <= 128 |
|
+ && ((val = strtoul (val2, &endp, 10)) != ULONG_MAX |
|
+ || errno != ERANGE) |
|
+ && *endp == '\0' |
|
+ && val <= INT_MAX) |
|
{ |
|
if (!add_scopelist (&scopelist, &nscopelist, |
|
&scopelist_nullbits, &prefix, |
|
- bits + 96, val)) |
|
+ bits, val)) |
|
{ |
|
free (line); |
|
fclose (fp); |
|
@@ -2076,173 +2056,191 @@ gaiconf_init (void) |
|
} |
|
} |
|
} |
|
- break; |
|
- |
|
- case 10: |
|
- if (strcmp (cmd, "precedence") == 0) |
|
+ else if (inet_pton (AF_INET, val1, &prefix.s6_addr32[3]) |
|
+ && (cp == NULL |
|
+ || (bits = strtoul (cp, &endp, 10)) != ULONG_MAX |
|
+ || errno != ERANGE) |
|
+ && *endp == '\0' |
|
+ && bits <= 32 |
|
+ && ((val = strtoul (val2, &endp, 10)) != ULONG_MAX |
|
+ || errno != ERANGE) |
|
+ && *endp == '\0' |
|
+ && val <= INT_MAX) |
|
{ |
|
- if (!add_prefixlist (&precedencelist, &nprecedencelist, |
|
- &precedencelist_nullbits, val1, val2, |
|
- &cp)) |
|
+ if (!add_scopelist (&scopelist, &nscopelist, |
|
+ &scopelist_nullbits, &prefix, |
|
+ bits + 96, val)) |
|
{ |
|
free (line); |
|
fclose (fp); |
|
goto no_file; |
|
} |
|
} |
|
- break; |
|
- } |
|
- } |
|
- |
|
- free (line); |
|
- |
|
- fclose (fp); |
|
- |
|
- /* Create the array for the labels. */ |
|
- struct prefixentry *new_labels; |
|
- if (nlabellist > 0) |
|
- { |
|
- if (!labellist_nullbits) |
|
- ++nlabellist; |
|
- new_labels = malloc (nlabellist * sizeof (*new_labels)); |
|
- if (new_labels == NULL) |
|
- goto no_file; |
|
- |
|
- int i = nlabellist; |
|
- if (!labellist_nullbits) |
|
- { |
|
- --i; |
|
- memset (&new_labels[i].prefix, '\0', sizeof (struct in6_addr)); |
|
- new_labels[i].bits = 0; |
|
- new_labels[i].val = 1; |
|
} |
|
+ break; |
|
|
|
- struct prefixlist *l = labellist; |
|
- while (i-- > 0) |
|
+ case 10: |
|
+ if (strcmp (cmd, "precedence") == 0) |
|
{ |
|
- new_labels[i] = l->entry; |
|
- l = l->next; |
|
+ if (!add_prefixlist (&precedencelist, &nprecedencelist, |
|
+ &precedencelist_nullbits, val1, val2, |
|
+ &cp)) |
|
+ { |
|
+ free (line); |
|
+ fclose (fp); |
|
+ goto no_file; |
|
+ } |
|
} |
|
- free_prefixlist (labellist); |
|
- labellist = NULL; |
|
- |
|
- /* Sort the entries so that the most specific ones are at |
|
- the beginning. */ |
|
- qsort (new_labels, nlabellist, sizeof (*new_labels), prefixcmp); |
|
+ break; |
|
} |
|
- else |
|
- new_labels = (struct prefixentry *) default_labels; |
|
- |
|
- struct prefixentry *new_precedence; |
|
- if (nprecedencelist > 0) |
|
- { |
|
- if (!precedencelist_nullbits) |
|
- ++nprecedencelist; |
|
- new_precedence = malloc (nprecedencelist * sizeof (*new_precedence)); |
|
- if (new_precedence == NULL) |
|
- { |
|
- if (new_labels != default_labels) |
|
- free (new_labels); |
|
- goto no_file; |
|
- } |
|
+ } |
|
|
|
- int i = nprecedencelist; |
|
- if (!precedencelist_nullbits) |
|
- { |
|
- --i; |
|
- memset (&new_precedence[i].prefix, '\0', |
|
- sizeof (struct in6_addr)); |
|
- new_precedence[i].bits = 0; |
|
- new_precedence[i].val = 40; |
|
- } |
|
+ free (line); |
|
|
|
- struct prefixlist *l = precedencelist; |
|
- while (i-- > 0) |
|
- { |
|
- new_precedence[i] = l->entry; |
|
- l = l->next; |
|
- } |
|
- free_prefixlist (precedencelist); |
|
- precedencelist = NULL; |
|
+ fclose (fp); |
|
|
|
- /* Sort the entries so that the most specific ones are at |
|
- the beginning. */ |
|
- qsort (new_precedence, nprecedencelist, sizeof (*new_precedence), |
|
- prefixcmp); |
|
+ /* Create the array for the labels. */ |
|
+ struct prefixentry *new_labels; |
|
+ if (nlabellist > 0) |
|
+ { |
|
+ if (!labellist_nullbits) |
|
+ ++nlabellist; |
|
+ new_labels = malloc (nlabellist * sizeof (*new_labels)); |
|
+ if (new_labels == NULL) |
|
+ goto no_file; |
|
+ |
|
+ int i = nlabellist; |
|
+ if (!labellist_nullbits) |
|
+ { |
|
+ --i; |
|
+ memset (&new_labels[i].prefix, '\0', sizeof (struct in6_addr)); |
|
+ new_labels[i].bits = 0; |
|
+ new_labels[i].val = 1; |
|
} |
|
- else |
|
- new_precedence = (struct prefixentry *) default_precedence; |
|
|
|
- struct scopeentry *new_scopes; |
|
- if (nscopelist > 0) |
|
+ struct prefixlist *l = labellist; |
|
+ while (i-- > 0) |
|
{ |
|
- if (!scopelist_nullbits) |
|
- ++nscopelist; |
|
- new_scopes = malloc (nscopelist * sizeof (*new_scopes)); |
|
- if (new_scopes == NULL) |
|
- { |
|
- if (new_labels != default_labels) |
|
- free (new_labels); |
|
- if (new_precedence != default_precedence) |
|
- free (new_precedence); |
|
- goto no_file; |
|
- } |
|
- |
|
- int i = nscopelist; |
|
- if (!scopelist_nullbits) |
|
- { |
|
- --i; |
|
- new_scopes[i].addr32 = 0; |
|
- new_scopes[i].netmask = 0; |
|
- new_scopes[i].scope = 14; |
|
- } |
|
+ new_labels[i] = l->entry; |
|
+ l = l->next; |
|
+ } |
|
+ free_prefixlist (labellist); |
|
+ labellist = NULL; |
|
|
|
- struct scopelist *l = scopelist; |
|
- while (i-- > 0) |
|
- { |
|
- new_scopes[i] = l->entry; |
|
- l = l->next; |
|
- } |
|
- free_scopelist (scopelist); |
|
+ /* Sort the entries so that the most specific ones are at |
|
+ the beginning. */ |
|
+ qsort (new_labels, nlabellist, sizeof (*new_labels), prefixcmp); |
|
+ } |
|
+ else |
|
+ new_labels = (struct prefixentry *) default_labels; |
|
|
|
- /* Sort the entries so that the most specific ones are at |
|
- the beginning. */ |
|
- qsort (new_scopes, nscopelist, sizeof (*new_scopes), |
|
- scopecmp); |
|
+ struct prefixentry *new_precedence; |
|
+ if (nprecedencelist > 0) |
|
+ { |
|
+ if (!precedencelist_nullbits) |
|
+ ++nprecedencelist; |
|
+ new_precedence = malloc (nprecedencelist * sizeof (*new_precedence)); |
|
+ if (new_precedence == NULL) |
|
+ { |
|
+ if (new_labels != default_labels) |
|
+ free (new_labels); |
|
+ goto no_file; |
|
} |
|
- else |
|
- new_scopes = (struct scopeentry *) default_scopes; |
|
- |
|
- /* Now we are ready to replace the values. */ |
|
- const struct prefixentry *old = labels; |
|
- labels = new_labels; |
|
- if (old != default_labels) |
|
- free ((void *) old); |
|
|
|
- old = precedence; |
|
- precedence = new_precedence; |
|
- if (old != default_precedence) |
|
- free ((void *) old); |
|
+ int i = nprecedencelist; |
|
+ if (!precedencelist_nullbits) |
|
+ { |
|
+ --i; |
|
+ memset (&new_precedence[i].prefix, '\0', |
|
+ sizeof (struct in6_addr)); |
|
+ new_precedence[i].bits = 0; |
|
+ new_precedence[i].val = 40; |
|
+ } |
|
|
|
- const struct scopeentry *oldscope = scopes; |
|
- scopes = new_scopes; |
|
- if (oldscope != default_scopes) |
|
- free ((void *) oldscope); |
|
+ struct prefixlist *l = precedencelist; |
|
+ while (i-- > 0) |
|
+ { |
|
+ new_precedence[i] = l->entry; |
|
+ l = l->next; |
|
+ } |
|
+ free_prefixlist (precedencelist); |
|
+ precedencelist = NULL; |
|
|
|
- save_gaiconf_mtime (&st); |
|
+ /* Sort the entries so that the most specific ones are at |
|
+ the beginning. */ |
|
+ qsort (new_precedence, nprecedencelist, sizeof (*new_precedence), |
|
+ prefixcmp); |
|
} |
|
else |
|
+ new_precedence = (struct prefixentry *) default_precedence; |
|
+ |
|
+ struct scopeentry *new_scopes; |
|
+ if (nscopelist > 0) |
|
{ |
|
- no_file: |
|
- free_prefixlist (labellist); |
|
- free_prefixlist (precedencelist); |
|
+ if (!scopelist_nullbits) |
|
+ ++nscopelist; |
|
+ new_scopes = malloc (nscopelist * sizeof (*new_scopes)); |
|
+ if (new_scopes == NULL) |
|
+ { |
|
+ if (new_labels != default_labels) |
|
+ free (new_labels); |
|
+ if (new_precedence != default_precedence) |
|
+ free (new_precedence); |
|
+ goto no_file; |
|
+ } |
|
+ |
|
+ int i = nscopelist; |
|
+ if (!scopelist_nullbits) |
|
+ { |
|
+ --i; |
|
+ new_scopes[i].addr32 = 0; |
|
+ new_scopes[i].netmask = 0; |
|
+ new_scopes[i].scope = 14; |
|
+ } |
|
+ |
|
+ struct scopelist *l = scopelist; |
|
+ while (i-- > 0) |
|
+ { |
|
+ new_scopes[i] = l->entry; |
|
+ l = l->next; |
|
+ } |
|
free_scopelist (scopelist); |
|
|
|
- /* If we previously read the file but it is gone now, free the |
|
- old data and use the builtin one. Leave the reload flag |
|
- alone. */ |
|
- fini (); |
|
+ /* Sort the entries so that the most specific ones are at |
|
+ the beginning. */ |
|
+ qsort (new_scopes, nscopelist, sizeof (*new_scopes), |
|
+ scopecmp); |
|
} |
|
+ else |
|
+ new_scopes = (struct scopeentry *) default_scopes; |
|
+ |
|
+ /* Now we are ready to replace the values. */ |
|
+ const struct prefixentry *old = labels; |
|
+ labels = new_labels; |
|
+ if (old != default_labels) |
|
+ free ((void *) old); |
|
+ |
|
+ old = precedence; |
|
+ precedence = new_precedence; |
|
+ if (old != default_precedence) |
|
+ free ((void *) old); |
|
+ |
|
+ const struct scopeentry *oldscope = scopes; |
|
+ scopes = new_scopes; |
|
+ if (oldscope != default_scopes) |
|
+ free ((void *) oldscope); |
|
+ |
|
+ save_gaiconf_mtime (&st); |
|
+ return; |
|
+ |
|
+no_file: |
|
+ free_prefixlist (labellist); |
|
+ free_prefixlist (precedencelist); |
|
+ free_scopelist (scopelist); |
|
+ |
|
+ /* If we previously read the file but it is gone now, free the old data and |
|
+ use the builtin one. Leave the reload flag alone. */ |
|
+ fini (); |
|
} |
|
|
|
|
|
|