return;
        }
  
 -      for (i = 0; i < map->off_arr->cnt; i++) {
 -              u32 next_off = map->off_arr->field_off[i];
 +      for (i = 0; i < foffs->cnt; i++) {
 +              u32 next_off = foffs->field_off[i];
 +              u32 sz = next_off - curr_off;
  
 -              memcpy(dst + curr_off, src + curr_off, next_off - curr_off);
 -              curr_off = next_off + map->off_arr->field_sz[i];
 +              memcpy(dst + curr_off, src + curr_off, sz);
-               curr_off += foffs->field_sz[i];
++              curr_off = next_off + foffs->field_sz[i];
        }
 -      memcpy(dst + curr_off, src + curr_off, map->value_size - curr_off);
 +      memcpy(dst + curr_off, src + curr_off, size - curr_off);
  }
  
  static inline void copy_map_value(struct bpf_map *map, void *dst, void *src)
                return;
        }
  
 -      for (i = 0; i < map->off_arr->cnt; i++) {
 -              u32 next_off = map->off_arr->field_off[i];
 +      for (i = 0; i < foffs->cnt; i++) {
 +              u32 next_off = foffs->field_off[i];
 +              u32 sz = next_off - curr_off;
  
 -              memset(dst + curr_off, 0, next_off - curr_off);
 -              curr_off = next_off + map->off_arr->field_sz[i];
 +              memset(dst + curr_off, 0, sz);
-               curr_off += foffs->field_sz[i];
++              curr_off = next_off + foffs->field_sz[i];
        }
 -      memset(dst + curr_off, 0, map->value_size - curr_off);
 +      memset(dst + curr_off, 0, size - curr_off);
 +}
 +
 +static inline void zero_map_value(struct bpf_map *map, void *dst)
 +{
 +      bpf_obj_memzero(map->field_offs, dst, map->value_size);
  }
  
  void copy_map_value_locked(struct bpf_map *map, void *dst, void *src,