Skip to content

Commit 0ad5a1e

Browse files
committed
...
1 parent 50c2f14 commit 0ad5a1e

2 files changed

Lines changed: 63 additions & 62 deletions

File tree

ipthelper/xshared.c

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -743,3 +743,66 @@ void command_jump(struct iptables_command_state *cs)
743743
cs->target->real_name : cs->jumpto);
744744
xt_params->opts = opts;
745745
}
746+
747+
748+
struct option *
749+
xs_merge_options(struct option *orig_opts, struct option *oldopts,
750+
const struct option *newopts, unsigned int *option_offset)
751+
{
752+
unsigned int num_orig = 0, num_old = 0, num_new = 0, i;
753+
struct option *merge;
754+
struct option *mp;
755+
struct option *old_base = oldopts;
756+
757+
if (newopts == NULL || newopts->name == NULL)
758+
return oldopts;
759+
760+
if (orig_opts != NULL)
761+
for (; orig_opts[num_orig].name != NULL; ++num_orig)
762+
;
763+
764+
if (oldopts != NULL)
765+
for (; oldopts[num_old].name != NULL; ++num_old)
766+
;
767+
768+
for (; newopts[num_new].name != NULL; ++num_new)
769+
;
770+
771+
if (oldopts != NULL && num_old >= num_orig) {
772+
oldopts += num_orig;
773+
num_old -= num_orig;
774+
} else {
775+
oldopts = NULL;
776+
num_old = 0;
777+
}
778+
779+
merge = malloc(sizeof(*merge) * (num_orig + num_new + num_old + 1));
780+
if (merge == NULL)
781+
return NULL;
782+
783+
if (num_orig != 0)
784+
memcpy(merge, orig_opts, sizeof(*merge) * num_orig);
785+
mp = merge + num_orig;
786+
787+
xt_params->option_offset += XT_OPTION_OFFSET_SCALE;
788+
*option_offset = xt_params->option_offset;
789+
790+
for (i = 0; i < num_new; ++i, ++mp) {
791+
mp->name = newopts[i].name;
792+
mp->has_arg = newopts[i].has_arg;
793+
mp->flag = newopts[i].flag;
794+
mp->val = newopts[i].val + *option_offset;
795+
}
796+
797+
if (oldopts != NULL && num_old != 0) {
798+
memcpy(mp, oldopts, sizeof(*mp) * num_old);
799+
mp += num_old;
800+
}
801+
802+
memset(mp, 0, sizeof(*mp));
803+
804+
if (old_base != NULL && old_base != orig_opts && old_base != xt_params->orig_opts)
805+
free(old_base);
806+
807+
return merge;
808+
}

ipthelper/xtoptions.c

Lines changed: 0 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -128,68 +128,6 @@ xtables_options_xfrm(struct option *orig_opts, struct option *oldopts,
128128
return merge;
129129
}
130130

131-
struct option *
132-
xs_merge_options(struct option *orig_opts, struct option *oldopts,
133-
const struct option *newopts, unsigned int *option_offset)
134-
{
135-
unsigned int num_orig = 0, num_old = 0, num_new = 0, i;
136-
struct option *merge;
137-
struct option *mp;
138-
struct option *old_base = oldopts;
139-
140-
if (newopts == NULL || newopts->name == NULL)
141-
return oldopts;
142-
143-
if (orig_opts != NULL)
144-
for (; orig_opts[num_orig].name != NULL; ++num_orig)
145-
;
146-
147-
if (oldopts != NULL)
148-
for (; oldopts[num_old].name != NULL; ++num_old)
149-
;
150-
151-
for (; newopts[num_new].name != NULL; ++num_new)
152-
;
153-
154-
if (oldopts != NULL && num_old >= num_orig) {
155-
oldopts += num_orig;
156-
num_old -= num_orig;
157-
} else {
158-
oldopts = NULL;
159-
num_old = 0;
160-
}
161-
162-
merge = malloc(sizeof(*merge) * (num_orig + num_new + num_old + 1));
163-
if (merge == NULL)
164-
return NULL;
165-
166-
if (num_orig != 0)
167-
memcpy(merge, orig_opts, sizeof(*merge) * num_orig);
168-
mp = merge + num_orig;
169-
170-
xt_params->option_offset += XT_OPTION_OFFSET_SCALE;
171-
*option_offset = xt_params->option_offset;
172-
173-
for (i = 0; i < num_new; ++i, ++mp) {
174-
mp->name = newopts[i].name;
175-
mp->has_arg = newopts[i].has_arg;
176-
mp->flag = newopts[i].flag;
177-
mp->val = newopts[i].val + *option_offset;
178-
}
179-
180-
if (oldopts != NULL && num_old != 0) {
181-
memcpy(mp, oldopts, sizeof(*mp) * num_old);
182-
mp += num_old;
183-
}
184-
185-
memset(mp, 0, sizeof(*mp));
186-
187-
if (old_base != NULL && old_base != orig_opts && old_base != xt_params->orig_opts)
188-
free(old_base);
189-
190-
return merge;
191-
}
192-
193131
/**
194132
* Give the upper limit for a certain type.
195133
*/

0 commit comments

Comments
 (0)