Added alloc_sanitize_path().
[rsync/rsync.git] / options.c
index 64ee665..166faf8 100644 (file)
--- a/options.c
+++ b/options.c
@@ -303,7 +303,8 @@ void usage(enum logcode F)
 enum {OPT_VERSION = 1000, OPT_SENDER, OPT_EXCLUDE, OPT_EXCLUDE_FROM,
       OPT_DELETE_AFTER, OPT_DELETE_EXCLUDED, OPT_LINK_DEST,
       OPT_INCLUDE, OPT_INCLUDE_FROM, OPT_MODIFY_WINDOW,
-      OPT_READ_BATCH, OPT_WRITE_BATCH};
+      OPT_READ_BATCH, OPT_WRITE_BATCH,
+      OPT_REFUSED_BASE = 9000};
 
 static struct poptOption long_options[] = {
   /* longName, shortName, argInfo, argPtr, value, descrip, argDesc */
@@ -425,9 +426,15 @@ static void set_refuse_options(char *bp)
        while (1) {
                if ((cp = strchr(bp, ' ')) != NULL)
                        *cp= '\0';
-               for (op = long_options; op->longName; op++) {
+               for (op = long_options; ; op++) {
+                       if (!op->longName) {
+                               rprintf(FLOG,
+                                   "Unknown option %s in \"refuse options\" setting\n",
+                                   bp);
+                               break;
+                       }
                        if (strcmp(bp, op->longName) == 0) {
-                               op->val = -(op - long_options) - 1;
+                               op->val = (op - long_options)+OPT_REFUSED_BASE;
                                break;
                        }
                }
@@ -571,10 +578,11 @@ int parse_arguments(int *argc, const char ***argv, int frommain)
 #endif
 
                default:
-                       /* A negative opt value means that set_refuse_options()
-                        * turned this option off (-opt-1 is its index). */
-                       if (opt < 0) {
-                               struct poptOption *op = &long_options[-opt-1];
+                       /* A large opt value means that set_refuse_options()
+                        * turned this option off (opt-BASE is its index). */
+                       if (opt >= OPT_REFUSED_BASE) {
+                               struct poptOption *op =
+                                   &long_options[opt-OPT_REFUSED_BASE];
                                int n = snprintf(err_buf, sizeof err_buf,
                                    "This server does not support --%s\n",
                                    op->longName) - 1;