75
75
jail_setv (int flags , ...)
76
76
{
77
77
va_list ap , tap ;
78
- struct jailparam * jp ;
79
- const char * name , * value ;
78
+ struct jailparam * jp , * jp_desc ;
79
+ const char * name ;
80
+ char * value , * desc_value ;
80
81
int njp , jid ;
81
82
82
83
/* Create the parameter list and import the parameters. */
@@ -86,15 +87,24 @@ jail_setv(int flags, ...)
86
87
(void )va_arg (tap , char * );
87
88
va_end (tap );
88
89
jp = alloca (njp * sizeof (struct jailparam ));
89
- for (njp = 0 ; (name = va_arg (ap , char * )) != NULL ;) {
90
+ jp_desc = NULL ;
91
+ desc_value = NULL ;
92
+ for (njp = 0 ; (name = va_arg (ap , char * )) != NULL ; njp ++ ) {
90
93
value = va_arg (ap , char * );
91
94
if (jailparam_init (jp + njp , name ) < 0 )
92
95
goto error ;
93
- if (jailparam_import (jp + njp ++ , value ) < 0 )
96
+ if (jailparam_import (jp + njp , value ) < 0 )
94
97
goto error ;
98
+ if (!strcmp (name , "desc" )
99
+ && (flags & (JAIL_GET_DESC | JAIL_OWN_DESC ))) {
100
+ jp_desc = jp + njp ;
101
+ desc_value = value ;
102
+ }
95
103
}
96
104
va_end (ap );
97
105
jid = jailparam_set (jp , njp , flags );
106
+ if (jid > 0 && jp_desc != NULL )
107
+ sprintf (desc_value , "%d" , * (int * )jp_desc -> jp_value );
98
108
jailparam_free (jp , njp );
99
109
return (jid );
100
110
112
122
jail_getv (int flags , ...)
113
123
{
114
124
va_list ap , tap ;
115
- struct jailparam * jp , * jp_lastjid , * jp_jid , * jp_name , * jp_key ;
125
+ struct jailparam * jp , * jp_desc , * jp_lastjid , * jp_jid , * jp_name , * jp_key ;
116
126
char * valarg , * value ;
117
- const char * name , * key_value , * lastjid_value , * jid_value , * name_value ;
127
+ const char * name , * key_value , * desc_value , * lastjid_value , * jid_value ;
128
+ const char * name_value ;
118
129
int njp , i , jid ;
119
130
120
131
/* Create the parameter list and find the key. */
@@ -126,15 +137,19 @@ jail_getv(int flags, ...)
126
137
127
138
jp = alloca (njp * sizeof (struct jailparam ));
128
139
va_copy (tap , ap );
129
- jp_lastjid = jp_jid = jp_name = NULL ;
130
- lastjid_value = jid_value = name_value = NULL ;
140
+ jp_desc = jp_lastjid = jp_jid = jp_name = NULL ;
141
+ desc_value = lastjid_value = jid_value = name_value = NULL ;
131
142
for (njp = 0 ; (name = va_arg (tap , char * )) != NULL ; njp ++ ) {
132
143
value = va_arg (tap , char * );
133
144
if (jailparam_init (jp + njp , name ) < 0 ) {
134
145
va_end (tap );
135
146
goto error ;
136
147
}
137
- if (!strcmp (jp [njp ].jp_name , "lastjid" )) {
148
+ if (!strcmp (jp [njp ].jp_name , "desc" )
149
+ && (flags & (JAIL_USE_DESC | JAIL_AT_DESC ))) {
150
+ jp_desc = jp + njp ;
151
+ desc_value = value ;
152
+ } else if (!strcmp (jp [njp ].jp_name , "lastjid" )) {
138
153
jp_lastjid = jp + njp ;
139
154
lastjid_value = value ;
140
155
} else if (!strcmp (jp [njp ].jp_name , "jid" )) {
@@ -147,7 +162,10 @@ jail_getv(int flags, ...)
147
162
}
148
163
va_end (tap );
149
164
/* Import the key parameter. */
150
- if (jp_lastjid != NULL ) {
165
+ if (jp_desc != NULL && (flags & JAIL_USE_DESC )) {
166
+ jp_key = jp_desc ;
167
+ key_value = desc_value ;
168
+ } else if (jp_lastjid != NULL ) {
151
169
jp_key = jp_lastjid ;
152
170
key_value = lastjid_value ;
153
171
} else if (jp_jid != NULL && strtol (jid_value , NULL , 10 ) != 0 ) {
@@ -163,6 +181,9 @@ jail_getv(int flags, ...)
163
181
}
164
182
if (jailparam_import (jp_key , key_value ) < 0 )
165
183
goto error ;
184
+ if (jp_desc != NULL && jp_desc != jp_key
185
+ && jailparam_import (jp_desc , desc_value ) < 0 )
186
+ goto error ;
166
187
/* Get the jail and export the parameters. */
167
188
jid = jailparam_get (jp , njp , flags );
168
189
if (jid < 0 )
571
592
jailparam_get (struct jailparam * jp , unsigned njp , int flags )
572
593
{
573
594
struct iovec * jiov ;
574
- struct jailparam * jp_lastjid , * jp_jid , * jp_name , * jp_key ;
595
+ struct jailparam * jp_desc , * jp_lastjid , * jp_jid , * jp_name , * jp_key ;
575
596
int i , ai , ki , jid , arrays , sanity ;
576
597
unsigned j ;
577
598
@@ -580,10 +601,13 @@ jailparam_get(struct jailparam *jp, unsigned njp, int flags)
580
601
* Find the key and any array parameters.
581
602
*/
582
603
jiov = alloca (sizeof (struct iovec ) * 2 * (njp + 1 ));
583
- jp_lastjid = jp_jid = jp_name = NULL ;
604
+ jp_desc = jp_lastjid = jp_jid = jp_name = NULL ;
584
605
arrays = 0 ;
585
606
for (ai = j = 0 ; j < njp ; j ++ ) {
586
- if (!strcmp (jp [j ].jp_name , "lastjid" ))
607
+ if (!strcmp (jp [j ].jp_name , "desc" )
608
+ && (flags & (JAIL_USE_DESC | JAIL_AT_DESC )))
609
+ jp_desc = jp + j ;
610
+ else if (!strcmp (jp [j ].jp_name , "lastjid" ))
587
611
jp_lastjid = jp + j ;
588
612
else if (!strcmp (jp [j ].jp_name , "jid" ))
589
613
jp_jid = jp + j ;
@@ -599,7 +623,9 @@ jailparam_get(struct jailparam *jp, unsigned njp, int flags)
599
623
ai ++ ;
600
624
}
601
625
}
602
- jp_key = jp_lastjid ? jp_lastjid :
626
+ jp_key = jp_desc && jp_desc -> jp_valuelen == sizeof (int ) &&
627
+ jp_desc -> jp_value && (flags & JAIL_USE_DESC ) ? jp_desc :
628
+ jp_lastjid ? jp_lastjid :
603
629
jp_jid && jp_jid -> jp_valuelen == sizeof (int ) &&
604
630
jp_jid -> jp_value && * (int * )jp_jid -> jp_value ? jp_jid : jp_name ;
605
631
if (jp_key == NULL || jp_key -> jp_value == NULL ) {
@@ -622,6 +648,14 @@ jailparam_get(struct jailparam *jp, unsigned njp, int flags)
622
648
jiov [ki ].iov_len = JAIL_ERRMSGLEN ;
623
649
ki ++ ;
624
650
jail_errmsg [0 ] = 0 ;
651
+ if (jp_desc != NULL && jp_desc != jp_key ) {
652
+ jiov [ki ].iov_base = jp_desc -> jp_name ;
653
+ jiov [ki ].iov_len = strlen (jp_desc -> jp_name ) + 1 ;
654
+ ki ++ ;
655
+ jiov [ki ].iov_base = jp_desc -> jp_value ;
656
+ jiov [ki ].iov_len = jp_desc -> jp_valuelen ;
657
+ ki ++ ;
658
+ }
625
659
if (arrays && jail_get (jiov , ki , flags ) < 0 ) {
626
660
if (!jail_errmsg [0 ])
627
661
snprintf (jail_errmsg , sizeof (jail_errmsg ),
@@ -649,7 +683,7 @@ jailparam_get(struct jailparam *jp, unsigned njp, int flags)
649
683
jiov [ai ].iov_base = jp [j ].jp_value ;
650
684
memset (jiov [ai ].iov_base , 0 , jiov [ai ].iov_len );
651
685
ai ++ ;
652
- } else if (jp + j != jp_key ) {
686
+ } else if (jp + j != jp_key && jp + j != jp_desc ) {
653
687
jiov [i ].iov_base = jp [j ].jp_name ;
654
688
jiov [i ].iov_len = strlen (jp [j ].jp_name ) + 1 ;
655
689
i ++ ;
0 commit comments