@@ -38,9 +38,12 @@ enum Status OSCILLOSCOPE_fetch_samples(
38
38
return E_BAD_ARGSIZE ;
39
39
}
40
40
41
- * rets = (uint8_t * )& g_buffer ;
41
+ // It's fine to call this even if g_buffer is NULL, i.e. before doing a
42
+ // capture. It just won't return anything.
43
+ * rets = (uint8_t * )g_buffer ;
42
44
* rets_size = g_n_samples * sizeof (* g_buffer );
43
- // Transport layer frees buffer after transmission is complete.
45
+ // Transport layer frees g_buffer after transmission is complete.
46
+ g_buffer = NULL ;
44
47
g_n_samples = 0 ;
45
48
46
49
return E_OK ;
@@ -93,22 +96,21 @@ static enum Status capture(
93
96
__attribute__((unused )) uint16_t * rets_size
94
97
) {
95
98
struct Input {
96
- uint8_t config ;
97
99
uint16_t samples ;
98
100
uint16_t delay ;
101
+ uint8_t config ;
99
102
uint8_t _pad [1 ];
100
103
} * input = NULL ;
101
104
102
- if (args_size != sizeof (struct Input ) - sizeof (input -> _pad )) {
103
- return E_BAD_ARGSIZE ;
104
- }
105
-
105
+ uint16_t const expected_size = sizeof (struct Input ) - sizeof (input -> _pad );
106
+ if (args_size != expected_size ) { return E_BAD_ARGSIZE ; }
106
107
input = * (struct Input * * )args ;
107
108
108
109
if (!input -> samples ) { return E_OK ; }
109
110
if (g_buffer ) { return E_RESOURCE_BUSY ; }
110
111
111
- if ( !(g_buffer = malloc ((input -> samples ) * sizeof (* g_buffer ))) ) {
112
+ // calloc to make sure we don't send garbage if capture is aborted early.
113
+ if ( !(g_buffer = calloc (input -> samples , sizeof (* g_buffer ))) ) {
112
114
return E_MEMORY_INSUFFICIENT ;
113
115
}
114
116
@@ -157,25 +159,24 @@ enum Status OSCILLOSCOPE_capture_dma(
157
159
__attribute__((unused )) uint16_t * rets_size
158
160
) {
159
161
struct Input {
160
- uint8_t config ;
161
162
uint16_t samples ;
162
163
uint16_t delay ;
164
+ uint8_t config ;
163
165
uint8_t _pad [1 ];
164
166
} * input = NULL ;
165
167
166
- if (args_size != sizeof (struct Input ) - sizeof (input -> _pad )) {
167
- return E_BAD_ARGSIZE ;
168
- }
169
-
168
+ uint16_t expected_size = sizeof (struct Input ) - sizeof (input -> _pad );
169
+ if (args_size != expected_size ) { return E_BAD_ARGSIZE ; }
170
170
input = * (struct Input * * )args ;
171
171
172
172
if (!input -> samples ) { return E_OK ; }
173
173
if (g_buffer ) { return E_RESOURCE_BUSY ; }
174
174
175
- if ( !(g_buffer = malloc (( input -> samples ) * sizeof (* g_buffer ))) ) {
175
+ if ( !(g_buffer = calloc ( input -> samples , sizeof (* g_buffer ))) ) {
176
176
return E_MEMORY_INSUFFICIENT ;
177
177
}
178
178
179
+ g_n_samples = input -> samples ;
179
180
SetSAMPLES_REQUESTED (input -> samples );
180
181
SetDELAY (input -> delay ); // Wait DELAY / 8 us between samples.
181
182
0 commit comments