@@ -149,4 +149,69 @@ TEST_F(set_layers_via_fds, set_layers_via_fds)
149
149
ASSERT_EQ (fclose (f_mountinfo ), 0 );
150
150
}
151
151
152
+ TEST_F (set_layers_via_fds , set_500_layers_via_fds )
153
+ {
154
+ int fd_context , fd_tmpfs , fd_overlay , fd_work , fd_upper , fd_lower ;
155
+ int layer_fds [500 ] = { [0 ... 499 ] = - EBADF };
156
+
157
+ ASSERT_EQ (unshare (CLONE_NEWNS ), 0 );
158
+ ASSERT_EQ (sys_mount (NULL , "/" , NULL , MS_SLAVE | MS_REC , NULL ), 0 );
159
+
160
+ fd_context = sys_fsopen ("tmpfs" , 0 );
161
+ ASSERT_GE (fd_context , 0 );
162
+
163
+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_CMD_CREATE , NULL , NULL , 0 ), 0 );
164
+ fd_tmpfs = sys_fsmount (fd_context , 0 , 0 );
165
+ ASSERT_GE (fd_tmpfs , 0 );
166
+ ASSERT_EQ (close (fd_context ), 0 );
167
+
168
+ for (int i = 0 ; i < ARRAY_SIZE (layer_fds ); i ++ ) {
169
+ char path [100 ];
170
+
171
+ sprintf (path , "l%d" , i );
172
+ ASSERT_EQ (mkdirat (fd_tmpfs , path , 0755 ), 0 );
173
+ layer_fds [i ] = openat (fd_tmpfs , path , O_DIRECTORY );
174
+ ASSERT_GE (layer_fds [i ], 0 );
175
+ }
176
+
177
+ ASSERT_EQ (mkdirat (fd_tmpfs , "w" , 0755 ), 0 );
178
+ fd_work = openat (fd_tmpfs , "w" , O_DIRECTORY );
179
+ ASSERT_GE (fd_work , 0 );
180
+
181
+ ASSERT_EQ (mkdirat (fd_tmpfs , "u" , 0755 ), 0 );
182
+ fd_upper = openat (fd_tmpfs , "u" , O_DIRECTORY );
183
+ ASSERT_GE (fd_upper , 0 );
184
+
185
+ ASSERT_EQ (mkdirat (fd_tmpfs , "l501" , 0755 ), 0 );
186
+ fd_lower = openat (fd_tmpfs , "l501" , O_DIRECTORY );
187
+ ASSERT_GE (fd_lower , 0 );
188
+
189
+ ASSERT_EQ (sys_move_mount (fd_tmpfs , "" , - EBADF , "/tmp" , MOVE_MOUNT_F_EMPTY_PATH ), 0 );
190
+ ASSERT_EQ (close (fd_tmpfs ), 0 );
191
+
192
+ fd_context = sys_fsopen ("overlay" , 0 );
193
+ ASSERT_GE (fd_context , 0 );
194
+
195
+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "workdir" , NULL , fd_work ), 0 );
196
+ ASSERT_EQ (close (fd_work ), 0 );
197
+
198
+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "upperdir" , NULL , fd_upper ), 0 );
199
+ ASSERT_EQ (close (fd_upper ), 0 );
200
+
201
+ for (int i = 0 ; i < ARRAY_SIZE (layer_fds ); i ++ ) {
202
+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "lowerdir+" , NULL , layer_fds [i ]), 0 );
203
+ ASSERT_EQ (close (layer_fds [i ]), 0 );
204
+ }
205
+
206
+ ASSERT_NE (sys_fsconfig (fd_context , FSCONFIG_SET_FD , "lowerdir+" , NULL , fd_lower ), 0 );
207
+ ASSERT_EQ (close (fd_lower ), 0 );
208
+
209
+ ASSERT_EQ (sys_fsconfig (fd_context , FSCONFIG_CMD_CREATE , NULL , NULL , 0 ), 0 );
210
+
211
+ fd_overlay = sys_fsmount (fd_context , 0 , 0 );
212
+ ASSERT_GE (fd_overlay , 0 );
213
+ ASSERT_EQ (close (fd_context ), 0 );
214
+ ASSERT_EQ (close (fd_overlay ), 0 );
215
+ }
216
+
152
217
TEST_HARNESS_MAIN
0 commit comments