X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=miscutils%2Fdevfsd.c;h=8f19288cc32f5e955e240847c0688f1c932cec11;hb=2c3b71a0d2e6e94d8fb75c6879b1b8203cea9e5a;hp=814fbd6868b284e55c5bb2ec975af4016c0e5349;hpb=10aea3e84e2715fb2a4b265faac273d11e8116ef;p=oweals%2Fbusybox.git diff --git a/miscutils/devfsd.c b/miscutils/devfsd.c index 814fbd686..8f19288cc 100644 --- a/miscutils/devfsd.c +++ b/miscutils/devfsd.c @@ -1,6 +1,6 @@ /* vi: set sw=4 ts=4: */ /* - * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + * Licensed under GPLv2 or later, see file LICENSE in this source tree. */ /* @@ -53,17 +53,12 @@ The postal address is: Richard Gooch, c/o ATNF, P. O. Box 76, Epping, N.S.W., 2121, Australia. */ - -//#include -//#include -//#include -#include -#include -#include -#include #include "libbb.h" #include "xregex.h" +#include +#include +#include /* Various defines taken from linux/major.h */ #define IDE0_MAJOR 3 @@ -97,18 +92,18 @@ #define DEVFS_PATHLEN 1024 /* Never change this otherwise the binary interface will change */ -struct devfsd_notify_struct -{ /* Use native C types to ensure same types in kernel and user space */ - unsigned int type; /* DEVFSD_NOTIFY_* value */ - unsigned int mode; /* Mode of the inode or device entry */ - unsigned int major; /* Major number of device entry */ - unsigned int minor; /* Minor number of device entry */ - unsigned int uid; /* Uid of process, inode or device entry */ - unsigned int gid; /* Gid of process, inode or device entry */ - unsigned int overrun_count; /* Number of lost events */ - unsigned int namelen; /* Number of characters not including '\0' */ - /* The device name MUST come last */ - char devname[DEVFS_PATHLEN]; /* This will be '\0' terminated */ +struct devfsd_notify_struct { + /* Use native C types to ensure same types in kernel and user space */ + unsigned int type; /* DEVFSD_NOTIFY_* value */ + unsigned int mode; /* Mode of the inode or device entry */ + unsigned int major; /* Major number of device entry */ + unsigned int minor; /* Minor number of device entry */ + unsigned int uid; /* Uid of process, inode or device entry */ + unsigned int gid; /* Gid of process, inode or device entry */ + unsigned int overrun_count; /* Number of lost events */ + unsigned int namelen; /* Number of characters not including '\0' */ + /* The device name MUST come last */ + char devname[DEVFS_PATHLEN]; /* This will be '\0' terminated */ }; #define BUFFER_SIZE 16384 @@ -156,32 +151,27 @@ struct devfsd_notify_struct #define AC_RMNEWCOMPAT 10 #define AC_RESTORE 11 -struct permissions_type -{ +struct permissions_type { mode_t mode; uid_t uid; gid_t gid; }; -struct execute_type -{ +struct execute_type { char *argv[MAX_ARGS + 1]; /* argv[0] must always be the programme */ }; -struct copy_type -{ +struct copy_type { const char *source; const char *destination; }; -struct action_type -{ +struct action_type { unsigned int what; unsigned int when; }; -struct config_entry_struct -{ +struct config_entry_struct { struct action_type action; regex_t preg; union @@ -194,8 +184,7 @@ struct config_entry_struct struct config_entry_struct *next; }; -struct get_variable_info -{ +struct get_variable_info { const struct devfsd_notify_struct *info; const char *devname; char devpath[STRING_LENGTH]; @@ -234,7 +223,6 @@ static char get_old_ide_name(unsigned , unsigned); static char *write_old_sd_name(char *, unsigned, unsigned, const char *); /* busybox functions */ -static void do_ioctl_or_die(int fd, int request, unsigned long event_mask_flag); static int get_uid_gid(int flag, const char *string); static void safe_memcpy(char * dest, const char * src, int len); static unsigned int scan_dev_name_common(const char *d, unsigned int n, int addendum, const char *ptr); @@ -246,12 +234,10 @@ static struct config_entry_struct *last_config = NULL; static char *mount_point = NULL; static volatile int caught_signal = FALSE; static volatile int caught_sighup = FALSE; -static struct initial_symlink_struct -{ +static struct initial_symlink_struct { const char *dest; const char *name; -} initial_symlinks[] = -{ +} initial_symlinks[] = { {"/proc/self/fd", "fd"}, {"fd/0", "stdin"}, {"fd/1", "stdout"}, @@ -259,12 +245,10 @@ static struct initial_symlink_struct {NULL, NULL}, }; -static struct event_type -{ +static struct event_type { unsigned int type; /* The DEVFSD_NOTIFY_* value */ const char *config_name; /* The name used in the config file */ -} event_types[] = -{ +} event_types[] = { {DEVFSD_NOTIFY_REGISTERED, "REGISTER"}, {DEVFSD_NOTIFY_UNREGISTERED, "UNREGISTER"}, {DEVFSD_NOTIFY_ASYNC_OPEN, "ASYNC_OPEN"}, @@ -278,10 +262,10 @@ static struct event_type /* Busybox messages */ -static const char * const bb_msg_proto_rev = "protocol revision"; -static const char * const bb_msg_bad_config = "bad %s config file: %s"; -static const char * const bb_msg_small_buffer = "buffer too small"; -static const char * const bb_msg_variable_not_found = "variable: %s not found"; +static const char bb_msg_proto_rev[] ALIGN1 = "protocol revision"; +static const char bb_msg_bad_config[] ALIGN1 = "bad %s config file: %s"; +static const char bb_msg_small_buffer[] ALIGN1 = "buffer too small"; +static const char bb_msg_variable_not_found[] ALIGN1 = "variable: %s not found"; /* Busybox stuff */ #if ENABLE_DEVFSD_VERBOSE || ENABLE_DEBUG @@ -293,17 +277,11 @@ static const char * const bb_msg_variable_not_found = "variable: %s not found"; #else #define info_logger(p, fmt, args...) #define msg_logger(p, fmt, args...) -#define msg_logger_and_die(p, fmt, args...) exit(1) +#define msg_logger_and_die(p, fmt, args...) exit(EXIT_FAILURE) #define error_logger(p, fmt, args...) -#define error_logger_and_die(p, fmt, args...) exit(1) +#define error_logger_and_die(p, fmt, args...) exit(EXIT_FAILURE) #endif -static void do_ioctl_or_die(int fd, int request, unsigned long event_mask_flag) -{ - if (ioctl(fd, request, event_mask_flag) == -1) - msg_logger_and_die(LOG_ERR, "ioctl"); -} - static void safe_memcpy(char *dest, const char *src, int len) { memcpy(dest , src, len); @@ -347,7 +325,7 @@ static unsigned int scan_dev_name(const char *d, unsigned int n, const char *ptr /* Public functions follow */ -int devfsd_main(int argc, char **argv); +int devfsd_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int devfsd_main(int argc, char **argv) { int print_version = FALSE; @@ -382,12 +360,8 @@ int devfsd_main(int argc, char **argv) xchdir(mount_point); fd = xopen(".devfsd", O_RDONLY); - - if (fcntl(fd, F_SETFD, FD_CLOEXEC) != 0) - bb_perror_msg_and_die("FD_CLOEXEC"); - - if (ioctl(fd, DEVFSDIOC_GET_PROTO_REV, &proto_rev) == -1) - bb_perror_msg_and_die("ioctl"); + close_on_exec_on(fd); + xioctl(fd, DEVFSDIOC_GET_PROTO_REV, &proto_rev); /*setup initial entries */ for (curr = initial_symlinks; curr->dest != NULL; ++curr) @@ -395,26 +369,25 @@ int devfsd_main(int argc, char **argv) /* NB: The check for CONFIG_FILE is done in read_config_file() */ - if (print_version ||(DEVFSD_PROTOCOL_REVISION_DAEMON != proto_rev)) { + if (print_version || (DEVFSD_PROTOCOL_REVISION_DAEMON != proto_rev)) { printf("%s v%s\nDaemon %s:\t%d\nKernel-side %s:\t%d\n", applet_name, DEVFSD_VERSION, bb_msg_proto_rev, - DEVFSD_PROTOCOL_REVISION_DAEMON,bb_msg_proto_rev, proto_rev); + DEVFSD_PROTOCOL_REVISION_DAEMON, bb_msg_proto_rev, proto_rev); if (DEVFSD_PROTOCOL_REVISION_DAEMON != proto_rev) bb_error_msg_and_die("%s mismatch!", bb_msg_proto_rev); exit(EXIT_SUCCESS); /* -v */ } /* Tell kernel we are special(i.e. we get to see hidden entries) */ - do_ioctl_or_die(fd, DEVFSDIOC_SET_EVENT_MASK, 0); + xioctl(fd, DEVFSDIOC_SET_EVENT_MASK, 0); + /* Set up SIGHUP and SIGUSR1 handlers */ sigemptyset(&new_action.sa_mask); new_action.sa_flags = 0; - - /* Set up SIGHUP and SIGUSR1 handlers */ new_action.sa_handler = signal_handler; - if (sigaction(SIGHUP, &new_action, NULL) != 0 || sigaction(SIGUSR1, &new_action, NULL) != 0) - bb_error_msg_and_die("sigaction"); + sigaction_set(SIGHUP, &new_action); + sigaction_set(SIGUSR1, &new_action); - printf("%s v%s started for %s\n",applet_name, DEVFSD_VERSION, mount_point); + printf("%s v%s started for %s\n", applet_name, DEVFSD_VERSION, mount_point); /* Set umask so that mknod(2), open(2) and mkdir(2) have complete control over permissions */ umask(0); @@ -423,8 +396,8 @@ int devfsd_main(int argc, char **argv) dir_operation(SERVICE, mount_point, 0, NULL); if (ENABLE_DEVFSD_FG_NP && no_polling) - exit(0); - + exit(EXIT_SUCCESS); + if (ENABLE_DEVFSD_VERBOSE || ENABLE_DEBUG) logmode = LOGMODE_BOTH; else if (do_daemon == TRUE) @@ -435,12 +408,12 @@ int devfsd_main(int argc, char **argv) if (do_daemon) { /* Release so that the child can grab it */ - do_ioctl_or_die(fd, DEVFSDIOC_RELEASE_EVENT_QUEUE, 0); + xioctl(fd, DEVFSDIOC_RELEASE_EVENT_QUEUE, 0); bb_daemonize_or_rexec(0, argv); } else if (ENABLE_DEVFSD_FG_NP) { setpgid(0, 0); /* Become process group leader */ } - + while (TRUE) { do_scan = do_servicing(fd, event_mask); @@ -480,7 +453,8 @@ static void read_config_file(char *path, int optional, unsigned long *event_mask free(p); return; } - if ((fp = fopen(path, "r")) != NULL) { + fp = fopen_for_read(path); + if (fp != NULL) { while (fgets(buf, STRING_LENGTH, fp) != NULL) { /* Skip whitespace */ line = buf; @@ -517,12 +491,11 @@ static void process_config_line(const char *line, unsigned long *event_mask) int i; /* !!!! Only Uppercase Keywords in devsfd.conf */ - static const char *const options[] = { - "CLEAR_CONFIG", "INCLUDE", "OPTIONAL_INCLUDE", - "RESTORE", "PERMISSIONS", "MODLOAD", "EXECUTE", - "COPY", "IGNORE", "MKOLDCOMPAT", "MKNEWCOMPAT", - "RMOLDCOMPAT", "RMNEWCOMPAT", 0 - }; + static const char options[] ALIGN1 = + "CLEAR_CONFIG\0""INCLUDE\0""OPTIONAL_INCLUDE\0" + "RESTORE\0""PERMISSIONS\0""MODLOAD\0""EXECUTE\0" + "COPY\0""IGNORE\0""MKOLDCOMPAT\0""MKNEWCOMPAT\0" + "RMOLDCOMPAT\0""RMNEWCOMPAT\0"; for (count = 0; count < MAX_ARGS; ++count) p[count][0] = '\0'; @@ -530,9 +503,9 @@ static void process_config_line(const char *line, unsigned long *event_mask) when, name, what, p[0], p[1], p[2], p[3], p[4], p[5], p[6]); - i = index_in_str_array(options, when); + i = index_in_strings(options, when); - /*"CLEAR_CONFIG"*/ + /* "CLEAR_CONFIG" */ if (i == 0) { free_config(); *event_mask = 0; @@ -570,13 +543,14 @@ static void process_config_line(const char *line, unsigned long *event_mask) goto process_config_line_err; } - i = index_in_str_array(options, what); + i = index_in_strings(options, what); switch (i) { case 4: /* "PERMISSIONS" */ new->action.what = AC_PERMISSIONS; /* Get user and group */ - if ((ptr = strchr(p[0], '.')) == NULL) { + ptr = strchr(p[0], '.'); + if (ptr == NULL) { msg = "UID.GID"; goto process_config_line_err; /*"missing '.' in UID.GID"*/ } @@ -644,7 +618,8 @@ static void process_config_line(const char *line, unsigned long *event_mask) last_config->next = new; last_config = new; return; -process_config_line_err: + + process_config_line_err: msg_logger_and_die(LOG_ERR, bb_msg_bad_config, msg , line); } /* End Function process_config_line */ @@ -657,14 +632,12 @@ static int do_servicing(int fd, unsigned long event_mask) { ssize_t bytes; struct devfsd_notify_struct info; - unsigned long tmp_event_mask; - /* Tell devfs what events we care about */ - tmp_event_mask = event_mask; - do_ioctl_or_die(fd, DEVFSDIOC_SET_EVENT_MASK, tmp_event_mask); + /* (void*) cast is only in order to match prototype */ + xioctl(fd, DEVFSDIOC_SET_EVENT_MASK, (void*)event_mask); while (!caught_signal) { errno = 0; - bytes = read(fd,(char *) &info, sizeof info); + bytes = read(fd, (char *) &info, sizeof info); if (caught_signal) break; /* Must test for this first */ if (errno == EINTR) @@ -697,9 +670,9 @@ static void service_name(const struct devfsd_notify_struct *info) msg_logger(LOG_ERR, "lost %u events", info->overrun_count); /* Discard lookups on "/dev/log" and "/dev/initctl" */ - if (info->type == DEVFSD_NOTIFY_LOOKUP + if (info->type == DEVFSD_NOTIFY_LOOKUP && ((info->devname[0] == 'l' && info->devname[1] == 'o' - && info->devname[2] == 'g' && !info->devname[3]) + && info->devname[2] == 'g' && !info->devname[3]) || (info->devname[0] == 'i' && info->devname[1] == 'n' && info->devname[2] == 'i' && info->devname[3] == 't' && info->devname[4] == 'c' && info->devname[5] == 't' @@ -709,7 +682,7 @@ static void service_name(const struct devfsd_notify_struct *info) for (entry = first_config; entry != NULL; entry = entry->next) { /* First check if action matches the type, then check if name matches */ - if (info->type != entry->action.when + if (info->type != entry->action.when || regexec(&entry->preg, info->devname, MAX_SUBEXPR, mbuf, 0) != 0) continue; for (n = 0;(n < MAX_SUBEXPR) && (mbuf[n].rm_so != -1); ++n) @@ -762,7 +735,7 @@ static void action_permissions(const struct devfsd_notify_struct *info, } /* End Function action_permissions */ static void action_modload(const struct devfsd_notify_struct *info, - const struct config_entry_struct *entry ATTRIBUTE_UNUSED) + const struct config_entry_struct *entry UNUSED_PARAM) /* [SUMMARY] Load a module. The devfs change. The config file entry. @@ -778,7 +751,7 @@ static void action_modload(const struct devfsd_notify_struct *info, argv[4] = concat_path_file("/dev", info->devname); /* device */ argv[5] = NULL; - wait4pid(xspawn(argv)); + spawn_and_wait(argv); free(argv[4]); } /* End Function action_modload */ @@ -810,7 +783,7 @@ static void action_execute(const struct devfsd_notify_struct *info, argv[count] = largv[count]; } argv[count] = NULL; - wait4pid(spawn(argv)); + spawn_and_wait(argv); } /* End Function action_execute */ @@ -968,10 +941,10 @@ static void restore(char *spath, struct stat source_stat, int rootlen) lstat(dpath, &dest_stat); free(dpath); if (S_ISLNK(source_stat.st_mode) || (source_stat.st_mode & S_ISVTX)) - copy_inode(dpath, &dest_stat,(source_stat.st_mode & ~S_ISVTX) , spath, &source_stat); + copy_inode(dpath, &dest_stat, (source_stat.st_mode & ~S_ISVTX), spath, &source_stat); if (S_ISDIR(source_stat.st_mode)) - dir_operation(RESTORE, spath, rootlen,NULL); + dir_operation(RESTORE, spath, rootlen, NULL); } @@ -996,8 +969,9 @@ static int copy_inode(const char *destpath, const struct stat *dest_stat, if ((source_stat->st_mode & S_IFMT) ==(dest_stat->st_mode & S_IFMT)) { /* Same type */ if (S_ISLNK(source_stat->st_mode)) { - if ((source_len = readlink(sourcepath, source_link, STRING_LENGTH - 1)) < 0 - || (dest_len = readlink(destpath , dest_link , STRING_LENGTH - 1)) < 0 + source_len = readlink(sourcepath, source_link, STRING_LENGTH - 1); + if ((source_len < 0) + || (dest_len = readlink(destpath, dest_link, STRING_LENGTH - 1)) < 0 ) return FALSE; source_link[source_len] = '\0'; @@ -1016,24 +990,27 @@ static int copy_inode(const char *destpath, const struct stat *dest_stat, unlink(destpath); switch (source_stat->st_mode & S_IFMT) { case S_IFSOCK: - if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) + fd = socket(AF_UNIX, SOCK_STREAM, 0); + if (fd < 0) break; un_addr.sun_family = AF_UNIX; snprintf(un_addr.sun_path, sizeof(un_addr.sun_path), "%s", destpath); - val = bind(fd,(struct sockaddr *) &un_addr,(int) sizeof un_addr); + val = bind(fd, (struct sockaddr *) &un_addr, (int) sizeof un_addr); close(fd); if (val != 0 || chmod(destpath, new_mode & ~S_IFMT) != 0) break; goto do_chown; case S_IFLNK: - if ((val = readlink(sourcepath, symlink_val, STRING_LENGTH - 1)) < 0) + val = readlink(sourcepath, symlink_val, STRING_LENGTH - 1); + if (val < 0) break; symlink_val[val] = '\0'; if (symlink(symlink_val, destpath) == 0) return TRUE; break; case S_IFREG: - if ((fd = open(destpath, O_RDONLY | O_CREAT, new_mode & ~S_IFMT)) < 0) + fd = open(destpath, O_RDONLY | O_CREAT, new_mode & ~S_IFMT); + if (fd < 0) break; close(fd); if (chmod(destpath, new_mode & ~S_IFMT) != 0) @@ -1099,7 +1076,7 @@ static int get_uid_gid(int flag, const char *string) if (isdigit(string[0]) ||((string[0] == '-') && isdigit(string[1]))) return atoi(string); - if (flag == UID && (pw_ent = getpwnam(string)) != NULL) + if (flag == UID && (pw_ent = getpwnam(string)) != NULL) return pw_ent->pw_uid; if (flag == GID && (grp_ent = getgrnam(string)) != NULL) @@ -1108,7 +1085,7 @@ static int get_uid_gid(int flag, const char *string) msg = "group"; if (ENABLE_DEVFSD_VERBOSE) - msg_logger(LOG_ERR,"unknown %s: %s, defaulting to %cid=0", msg, string, msg[0]); + msg_logger(LOG_ERR, "unknown %s: %s, defaulting to %cid=0", msg, string, msg[0]); return 0; }/* End Function get_uid_gid */ @@ -1148,27 +1125,26 @@ static void signal_handler(int sig) static const char *get_variable(const char *variable, void *info) { + static char sbuf[sizeof(int)*3 + 2]; /* sign and NUL */ + static char *hostname; + struct get_variable_info *gv_info = info; - static char hostname[STRING_LENGTH], sbuf[STRING_LENGTH]; - const char *field_names[] = { "hostname", "mntpt", "devpath", "devname", - "uid", "gid", "mode", hostname, mount_point, - gv_info->devpath, gv_info->devname, 0 }; + const char *field_names[] = { + "hostname", "mntpt", "devpath", "devname", + "uid", "gid", "mode", hostname, mount_point, + gv_info->devpath, gv_info->devname, NULL + }; int i; - if (gethostname(hostname, STRING_LENGTH - 1) != 0) - error_logger_and_die(LOG_ERR, "gethostname"); - - /* Here on error we should do exit(RV_SYS_ERROR), instead we do exit(EXIT_FAILURE) */ - hostname[STRING_LENGTH - 1] = '\0'; - + if (!hostname) + hostname = safe_gethostname(); /* index_in_str_array returns i>=0 */ i = index_in_str_array(field_names, variable); if (i > 6 || i < 0 || (i > 1 && gv_info == NULL)) - return NULL; - if (i >= 0 && i <= 3) { + return NULL; + if (i >= 0 && i <= 3) return field_names[i + 7]; - } if (i == 4) sprintf(sbuf, "%u", gv_info->info->uid); @@ -1211,7 +1187,8 @@ static void dir_operation(int type, const char * dir_name, int var, unsigned lon struct dirent *de; char *path; - if ((dp = warn_opendir(dir_name)) == NULL) + dp = warn_opendir(dir_name); + if (dp == NULL) return; while ((de = readdir(dp)) != NULL) { @@ -1353,8 +1330,7 @@ static void expand_regexp(char *output, size_t outsize, const char *input, /* from compat_name.c */ -struct translate_struct -{ +struct translate_struct { const char *match; /* The string to match to(up to length) */ const char *format; /* Format of output, "%s" takes data past match string, NULL is effectively "%s"(just more efficient) */ @@ -1456,7 +1432,7 @@ const char *get_old_name(const char *devname, unsigned int namelen, /* 2 ==scsi/disc, 4 == scsi/part */ if (i == 2 || i == 4) - compat_name = write_old_sd_name(buffer, major, minor,((i == 2) ? "" : (ptr + 4))); + compat_name = write_old_sd_name(buffer, major, minor, ((i == 2) ? "" : (ptr + 4))); /* 5 == scsi/mt */ if (i == 5) { @@ -1595,7 +1571,8 @@ int st_expr_expand(char *output, unsigned int length, const char *input, ch = input[1]; if (isspace(ch) ||(ch == '/') ||(ch == '\0')) { /* User's own home directory: leave separator for next time */ - if ((env = getenv("HOME")) == NULL) { + env = getenv("HOME"); + if (env == NULL) { info_logger(LOG_INFO, bb_msg_variable_not_found, "HOME"); return FALSE; } @@ -1608,13 +1585,14 @@ int st_expr_expand(char *output, unsigned int length, const char *input, } /* Someone else's home directory */ for (ptr = ++input; !isspace(ch) && (ch != '/') && (ch != '\0'); ch = *++ptr) - /* VOID */ ; + /* VOID */; len = ptr - input; if (len >= sizeof tmp) goto st_expr_expand_out; safe_memcpy(tmp, input, len); input = ptr - 1; - if ((pwent = getpwnam(tmp)) == NULL) { + pwent = getpwnam(tmp); + if (pwent == NULL) { info_logger(LOG_INFO, "no pwent for: %s", tmp); return FALSE; } @@ -1674,7 +1652,7 @@ static const char *expand_variable(char *buffer, unsigned int length, ch = input[0]; if (ch == '$') { /* Special case for "$$": PID */ - sprintf(tmp, "%d",(int) getpid()); + sprintf(tmp, "%d", (int) getpid()); len = strlen(tmp); if (len + *out_pos >= length) goto expand_variable_out; @@ -1687,14 +1665,15 @@ static const char *expand_variable(char *buffer, unsigned int length, if (ch != '{') { /* Simple variable expansion */ for (ptr = input; isalnum(ch) || (ch == '_') || (ch == ':'); ch = *++ptr) - /* VOID */ ; + /* VOID */; len = ptr - input; if ((size_t)len >= sizeof tmp) goto expand_variable_out; safe_memcpy(tmp, input, len); input = ptr - 1; - if ((env = get_variable_v2(tmp, func, info)) == NULL) { + env = get_variable_v2(tmp, func, info); + if (env == NULL) { info_logger(LOG_INFO, bb_msg_variable_not_found, tmp); return NULL; } @@ -1746,7 +1725,7 @@ static const char *expand_variable(char *buffer, unsigned int length, --open_braces; break; case '\0': - info_logger(LOG_INFO,"\"}\" not found in: %s", input); + info_logger(LOG_INFO, "\"}\" not found in: %s", input); return NULL; default: break; @@ -1754,7 +1733,8 @@ static const char *expand_variable(char *buffer, unsigned int length, } --ptr; /* At this point ptr should point to closing brace of "${var:-word}" */ - if ((env = get_variable_v2(tmp, func, info)) != NULL) { + env = get_variable_v2(tmp, func, info); + if (env != NULL) { /* Found environment variable, so skip the input to the closing brace and return the variable */ input = ptr;