commit bc0d18d873abf2cda6842ad8bb4df2a31dc0fbac Author: Siddhesh Poyarekar 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 Reviewed-by: DJ Delorie 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 (); }