--- rm.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/rm.c b/rm.c index 1f23c09..c1ae4fd 100644 --- a/rm.c +++ b/rm.c _AT_@ -11,9 +11,29 @@ usage(void) eprintf("usage: %s [-f] [-iRr] file ...\n", argv0); } +static int +dotdot(char *path) +{ + char *s, *t; + size_t len; + + len = strlen(path); + for (t = path + len; t > path && t[-1] == '/'; --t) + ; + for (s = t; s > path && s[-1] != '/'; --s) + ; + + if (t - s == 1 && *s == '.') + return 1; + if (t - s == 2 && s[0] == '.' && s[1] == '.') + return 1; + return 0; +} + int main(int argc, char *argv[]) { + char *s; struct recursor r = { .fn = rm, .maxdepth = 1, .follow = 'P' }; ARGBEGIN { _AT_@ -39,8 +59,12 @@ main(int argc, char *argv[]) } for (; *argv; argc--, argv++) { - if (strcmp(*argv, ".") && strcmp(*argv, "..")) - recurse(AT_FDCWD, *argv, NULL, &r); + if (dotdot(*argv)) { + weprintf("\".\" and \"..\" may not be removed"); + rm_status = 1; + continue; + } + recurse(AT_FDCWD, *argv, NULL, &r); } return rm_status || recurse_status; -- 2.46.1Received on Fri Apr 25 2025 - 12:39:20 CEST
This archive was generated by hypermail 2.3.0 : Fri Apr 25 2025 - 12:48:09 CEST