Commit c3484c275db5abe88e01a7e1a80932112c9bbf69

Authored by Richard Cochran
Committed by David S. Miller
1 parent c7ec0badcc

ptp: reduce stack usage when measuring the system time offset

This patch removes the large buffer from the stack of the system
offset ioctl and replaces it with a kmalloced buffer.

Signed-off-by: Richard Cochran <richardcochran@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

Showing 1 changed file with 14 additions and 7 deletions Side-by-side Diff

drivers/ptp/ptp_chardev.c
... ... @@ -34,7 +34,7 @@
34 34 {
35 35 struct ptp_clock_caps caps;
36 36 struct ptp_clock_request req;
37   - struct ptp_sys_offset sysoff;
  37 + struct ptp_sys_offset *sysoff = NULL;
38 38 struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock);
39 39 struct ptp_clock_info *ops = ptp->info;
40 40 struct ptp_clock_time *pct;
41 41  
42 42  
... ... @@ -94,17 +94,22 @@
94 94 break;
95 95  
96 96 case PTP_SYS_OFFSET:
97   - if (copy_from_user(&sysoff, (void __user *)arg,
98   - sizeof(sysoff))) {
  97 + sysoff = kmalloc(sizeof(*sysoff), GFP_KERNEL);
  98 + if (!sysoff) {
  99 + err = -ENOMEM;
  100 + break;
  101 + }
  102 + if (copy_from_user(sysoff, (void __user *)arg,
  103 + sizeof(*sysoff))) {
99 104 err = -EFAULT;
100 105 break;
101 106 }
102   - if (sysoff.n_samples > PTP_MAX_SAMPLES) {
  107 + if (sysoff->n_samples > PTP_MAX_SAMPLES) {
103 108 err = -EINVAL;
104 109 break;
105 110 }
106   - pct = &sysoff.ts[0];
107   - for (i = 0; i < sysoff.n_samples; i++) {
  111 + pct = &sysoff->ts[0];
  112 + for (i = 0; i < sysoff->n_samples; i++) {
108 113 getnstimeofday(&ts);
109 114 pct->sec = ts.tv_sec;
110 115 pct->nsec = ts.tv_nsec;
... ... @@ -117,7 +122,7 @@
117 122 getnstimeofday(&ts);
118 123 pct->sec = ts.tv_sec;
119 124 pct->nsec = ts.tv_nsec;
120   - if (copy_to_user((void __user *)arg, &sysoff, sizeof(sysoff)))
  125 + if (copy_to_user((void __user *)arg, sysoff, sizeof(*sysoff)))
121 126 err = -EFAULT;
122 127 break;
123 128  
... ... @@ -125,6 +130,8 @@
125 130 err = -ENOTTY;
126 131 break;
127 132 }
  133 +
  134 + kfree(sysoff);
128 135 return err;
129 136 }
130 137