@@ -129,43 +129,47 @@ void shared_modules_struct_pack_into(mp_obj_t fmt_in, byte *p, byte *end_p, size
129129 mp_raise_RuntimeError (translate ("buffer too small" ));
130130 }
131131
132- size_t i ;
132+ size_t i = 0 ;
133133 byte * p_base = p ;
134- for ( i = 0 ; i < n_args ; ) {
134+ while ( * fmt ) {
135135 mp_uint_t sz = 1 ;
136- if (* fmt == '\0' ) {
137- // more arguments given than used by format string; CPython raises struct.error here
138- mp_raise_RuntimeError (translate ("too many arguments provided with the given format" ));
139- }
140136 struct_validate_format (* fmt );
141137
142138 if (unichar_isdigit (* fmt )) {
143139 sz = get_fmt_num (& fmt );
144140 }
145141
146142 if (* fmt == 's' ) {
147- mp_buffer_info_t bufinfo ;
148- mp_get_buffer_raise (args [i ++ ], & bufinfo , MP_BUFFER_READ );
149- mp_uint_t to_copy = sz ;
150- if (bufinfo .len < to_copy ) {
151- to_copy = bufinfo .len ;
143+ if (i < n_args ) {
144+ mp_buffer_info_t bufinfo ;
145+ mp_get_buffer_raise (args [i ], & bufinfo , MP_BUFFER_READ );
146+ mp_uint_t to_copy = sz ;
147+ if (bufinfo .len < to_copy ) {
148+ to_copy = bufinfo .len ;
149+ }
150+ memcpy (p , bufinfo .buf , to_copy );
151+ memset (p + to_copy , 0 , sz - to_copy );
152152 }
153- memcpy (p , bufinfo .buf , to_copy );
154- memset (p + to_copy , 0 , sz - to_copy );
153+ i ++ ;
155154 p += sz ;
156155 } else {
157156 while (sz -- ) {
158157 // Pad bytes don't have a corresponding argument.
159158 if (* fmt == 'x' ) {
160159 mp_binary_set_val (fmt_type , * fmt , MP_OBJ_NEW_SMALL_INT (0 ), p_base , & p );
161160 } else {
162- mp_binary_set_val (fmt_type , * fmt , args [i ], p_base , & p );
161+ if (i < n_args ) {
162+ mp_binary_set_val (fmt_type , * fmt , args [i ], p_base , & p );
163+ }
163164 i ++ ;
164165 }
165166 }
166167 }
167168 fmt ++ ;
168169 }
170+ if (i != n_args ) {
171+ mp_raise_ValueError_varg (translate ("%q length must be %d" ), MP_QSTR_args , i );
172+ }
169173}
170174
171175mp_obj_tuple_t * shared_modules_struct_unpack_from (mp_obj_t fmt_in , byte * p , byte * end_p , bool exact_size ) {
0 commit comments