@@ -126,7 +126,9 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
126
126
switch (cmd ) {
127
127
128
128
case PTP_CLOCK_GETCAPS :
129
+ case PTP_CLOCK_GETCAPS2 :
129
130
memset (& caps , 0 , sizeof (caps ));
131
+
130
132
caps .max_adj = ptp -> info -> max_adj ;
131
133
caps .n_alarm = ptp -> info -> n_alarm ;
132
134
caps .n_ext_ts = ptp -> info -> n_ext_ts ;
@@ -139,11 +141,24 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
139
141
break ;
140
142
141
143
case PTP_EXTTS_REQUEST :
144
+ case PTP_EXTTS_REQUEST2 :
145
+ memset (& req , 0 , sizeof (req ));
146
+
142
147
if (copy_from_user (& req .extts , (void __user * )arg ,
143
148
sizeof (req .extts ))) {
144
149
err = - EFAULT ;
145
150
break ;
146
151
}
152
+ if (((req .extts .flags & ~PTP_EXTTS_VALID_FLAGS ) ||
153
+ req .extts .rsv [0 ] || req .extts .rsv [1 ]) &&
154
+ cmd == PTP_EXTTS_REQUEST2 ) {
155
+ err = - EINVAL ;
156
+ break ;
157
+ } else if (cmd == PTP_EXTTS_REQUEST ) {
158
+ req .extts .flags &= ~PTP_EXTTS_VALID_FLAGS ;
159
+ req .extts .rsv [0 ] = 0 ;
160
+ req .extts .rsv [1 ] = 0 ;
161
+ }
147
162
if (req .extts .index >= ops -> n_ext_ts ) {
148
163
err = - EINVAL ;
149
164
break ;
@@ -154,11 +169,27 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
154
169
break ;
155
170
156
171
case PTP_PEROUT_REQUEST :
172
+ case PTP_PEROUT_REQUEST2 :
173
+ memset (& req , 0 , sizeof (req ));
174
+
157
175
if (copy_from_user (& req .perout , (void __user * )arg ,
158
176
sizeof (req .perout ))) {
159
177
err = - EFAULT ;
160
178
break ;
161
179
}
180
+ if (((req .perout .flags & ~PTP_PEROUT_VALID_FLAGS ) ||
181
+ req .perout .rsv [0 ] || req .perout .rsv [1 ] ||
182
+ req .perout .rsv [2 ] || req .perout .rsv [3 ]) &&
183
+ cmd == PTP_PEROUT_REQUEST2 ) {
184
+ err = - EINVAL ;
185
+ break ;
186
+ } else if (cmd == PTP_PEROUT_REQUEST ) {
187
+ req .perout .flags &= ~PTP_PEROUT_VALID_FLAGS ;
188
+ req .perout .rsv [0 ] = 0 ;
189
+ req .perout .rsv [1 ] = 0 ;
190
+ req .perout .rsv [2 ] = 0 ;
191
+ req .perout .rsv [3 ] = 0 ;
192
+ }
162
193
if (req .perout .index >= ops -> n_per_out ) {
163
194
err = - EINVAL ;
164
195
break ;
@@ -169,6 +200,9 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
169
200
break ;
170
201
171
202
case PTP_ENABLE_PPS :
203
+ case PTP_ENABLE_PPS2 :
204
+ memset (& req , 0 , sizeof (req ));
205
+
172
206
if (!capable (CAP_SYS_TIME ))
173
207
return - EPERM ;
174
208
req .type = PTP_CLK_REQ_PPS ;
@@ -177,6 +211,7 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
177
211
break ;
178
212
179
213
case PTP_SYS_OFFSET_PRECISE :
214
+ case PTP_SYS_OFFSET_PRECISE2 :
180
215
if (!ptp -> info -> getcrosststamp ) {
181
216
err = - EOPNOTSUPP ;
182
217
break ;
@@ -201,6 +236,7 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
201
236
break ;
202
237
203
238
case PTP_SYS_OFFSET_EXTENDED :
239
+ case PTP_SYS_OFFSET_EXTENDED2 :
204
240
if (!ptp -> info -> gettimex64 ) {
205
241
err = - EOPNOTSUPP ;
206
242
break ;
@@ -232,6 +268,7 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
232
268
break ;
233
269
234
270
case PTP_SYS_OFFSET :
271
+ case PTP_SYS_OFFSET2 :
235
272
sysoff = memdup_user ((void __user * )arg , sizeof (* sysoff ));
236
273
if (IS_ERR (sysoff )) {
237
274
err = PTR_ERR (sysoff );
@@ -266,10 +303,23 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
266
303
break ;
267
304
268
305
case PTP_PIN_GETFUNC :
306
+ case PTP_PIN_GETFUNC2 :
269
307
if (copy_from_user (& pd , (void __user * )arg , sizeof (pd ))) {
270
308
err = - EFAULT ;
271
309
break ;
272
310
}
311
+ if ((pd .rsv [0 ] || pd .rsv [1 ] || pd .rsv [2 ]
312
+ || pd .rsv [3 ] || pd .rsv [4 ])
313
+ && cmd == PTP_PIN_GETFUNC2 ) {
314
+ err = - EINVAL ;
315
+ break ;
316
+ } else if (cmd == PTP_PIN_GETFUNC ) {
317
+ pd .rsv [0 ] = 0 ;
318
+ pd .rsv [1 ] = 0 ;
319
+ pd .rsv [2 ] = 0 ;
320
+ pd .rsv [3 ] = 0 ;
321
+ pd .rsv [4 ] = 0 ;
322
+ }
273
323
pin_index = pd .index ;
274
324
if (pin_index >= ops -> n_pins ) {
275
325
err = - EINVAL ;
@@ -285,10 +335,23 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
285
335
break ;
286
336
287
337
case PTP_PIN_SETFUNC :
338
+ case PTP_PIN_SETFUNC2 :
288
339
if (copy_from_user (& pd , (void __user * )arg , sizeof (pd ))) {
289
340
err = - EFAULT ;
290
341
break ;
291
342
}
343
+ if ((pd .rsv [0 ] || pd .rsv [1 ] || pd .rsv [2 ]
344
+ || pd .rsv [3 ] || pd .rsv [4 ])
345
+ && cmd == PTP_PIN_SETFUNC2 ) {
346
+ err = - EINVAL ;
347
+ break ;
348
+ } else if (cmd == PTP_PIN_SETFUNC ) {
349
+ pd .rsv [0 ] = 0 ;
350
+ pd .rsv [1 ] = 0 ;
351
+ pd .rsv [2 ] = 0 ;
352
+ pd .rsv [3 ] = 0 ;
353
+ pd .rsv [4 ] = 0 ;
354
+ }
292
355
pin_index = pd .index ;
293
356
if (pin_index >= ops -> n_pins ) {
294
357
err = - EINVAL ;
0 commit comments