1111#include "macro.h"
1212#include "mkdir.h"
1313#include "path-util.h"
14+ #include "random-util.h"
1415#include "rm-rf.h"
1516#include "stdio-util.h"
1617#include "string-util.h"
@@ -836,12 +837,24 @@ static void test_path_is_encrypted(void) {
836837 test_path_is_encrypted_one ("/dev" , booted > 0 ? false : -1 );
837838}
838839
840+ static void create_binary_file (const char * p , const void * data , size_t l ) {
841+ _cleanup_close_ int fd = -1 ;
842+
843+ fd = open (p , O_CREAT |O_WRONLY |O_EXCL |O_CLOEXEC , 0600 );
844+ assert_se (fd >= 0 );
845+ assert_se (write (fd , data , l ) == (ssize_t ) l );
846+ }
847+
839848static void test_conservative_rename (void ) {
840849 _cleanup_ (unlink_and_freep ) char * p = NULL ;
841850 _cleanup_free_ char * q = NULL ;
851+ size_t l = 16 * 1024 + random_u64 () % (32 * 1024 ); /* some randomly sized buffer 16k…48k */
852+ uint8_t buffer [l + 1 ];
853+
854+ random_bytes (buffer , l );
842855
843856 assert_se (tempfn_random_child (NULL , NULL , & p ) >= 0 );
844- assert_se ( write_string_file ( p , "this is a test" , WRITE_STRING_FILE_CREATE ) >= 0 );
857+ create_binary_file ( p , buffer , l );
845858
846859 assert_se (tempfn_random_child (NULL , NULL , & q ) >= 0 );
847860
@@ -856,27 +869,30 @@ static void test_conservative_rename(void) {
856869 assert_se (access (q , F_OK ) < 0 && errno == ENOENT );
857870
858871 /* Check that a manual new writeout is also detected */
859- assert_se ( write_string_file ( q , "this is a test" , WRITE_STRING_FILE_CREATE ) >= 0 );
872+ create_binary_file ( q , buffer , l );
860873 assert_se (conservative_renameat (AT_FDCWD , q , AT_FDCWD , p ) == 0 );
861874 assert_se (access (q , F_OK ) < 0 && errno == ENOENT );
862875
863876 /* Check that a minimally changed version is detected */
864- assert_se (write_string_file (q , "this is a_test" , WRITE_STRING_FILE_CREATE ) >= 0 );
877+ buffer [47 ] = ~buffer [47 ];
878+ create_binary_file (q , buffer , l );
865879 assert_se (conservative_renameat (AT_FDCWD , q , AT_FDCWD , p ) > 0 );
866880 assert_se (access (q , F_OK ) < 0 && errno == ENOENT );
867881
868882 /* Check that this really is new updated version */
869- assert_se ( write_string_file ( q , "this is a_test" , WRITE_STRING_FILE_CREATE ) >= 0 );
883+ create_binary_file ( q , buffer , l );
870884 assert_se (conservative_renameat (AT_FDCWD , q , AT_FDCWD , p ) == 0 );
871885 assert_se (access (q , F_OK ) < 0 && errno == ENOENT );
872886
873887 /* Make sure we detect extended files */
874- assert_se (write_string_file (q , "this is a_testx" , WRITE_STRING_FILE_CREATE ) >= 0 );
888+ buffer [l ++ ] = 47 ;
889+ create_binary_file (q , buffer , l );
875890 assert_se (conservative_renameat (AT_FDCWD , q , AT_FDCWD , p ) > 0 );
876891 assert_se (access (q , F_OK ) < 0 && errno == ENOENT );
877892
878893 /* Make sure we detect truncated files */
879- assert_se (write_string_file (q , "this is a_test" , WRITE_STRING_FILE_CREATE ) >= 0 );
894+ l -- ;
895+ create_binary_file (q , buffer , l );
880896 assert_se (conservative_renameat (AT_FDCWD , q , AT_FDCWD , p ) > 0 );
881897 assert_se (access (q , F_OK ) < 0 && errno == ENOENT );
882898}
0 commit comments