aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/librc/librc.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/src/librc/librc.c b/src/librc/librc.c
index d82880fb..40b975a9 100644
--- a/src/librc/librc.c
+++ b/src/librc/librc.c
@@ -168,7 +168,7 @@ file_regex(const char *file, const char *regex)
char *line = NULL;
size_t len = 0;
regex_t re;
- bool retval = false;
+ bool retval = true;
int result;
if (!(fp = fopen(file, "r")))
@@ -184,11 +184,21 @@ file_regex(const char *file, const char *regex)
}
while ((rc_getline(&line, &len, fp))) {
- if (regexec(&re, line, 0, NULL, 0) == 0)
- retval = true;
- if (retval)
- break;
+ char *str = line;
+ /* some /proc files have \0 separated content so we have to
+ loop through the 'line' */
+ do {
+ if (regexec(&re, str, 0, NULL, 0) == 0)
+ goto found;
+ str += strlen(str) + 1;
+ /* len is the size of allocated buffer and we don't
+ want call regexec BUFSIZE times. find next str */
+ while (*str == '\0' && str < line + len)
+ str++;
+ } while (str < line + len);
}
+ retval = false;
+found:
fclose(fp);
free(line);
regfree(&re);