// unix-ey fs stuff
+#include <algorithm>
#include <unistd.h>
#include <sys/types.h>
#include <time.h>
//};
void Client::fill_dirent(struct dirent *de, const char *name, int type, uint64_t ino, loff_t next_off)
{
- strncpy(de->d_name, name, 255);
- de->d_name[255] = '\0';
+ size_t len = strlen(name);
+ len = std::min(len, (size_t)255);
+ memcpy(de->d_name, name, len);
+ de->d_name[len] = '\0';
#if !defined(__CYGWIN__) && !(defined(_WIN32))
de->d_ino = ino;
#if !defined(__APPLE__) && !defined(__FreeBSD__)
de->d_off = next_off;
#endif
- de->d_reclen = 1;
+ // Calculate the real used size of the record
+ len = (uintptr_t)&de->d_name[len] - (uintptr_t)de + 1;
+ // The record size must be a multiple of the alignment of 'struct dirent'
+ de->d_reclen = (len + alignof(struct dirent) - 1) & ~(alignof(struct dirent) - 1);
de->d_type = IFTODT(type);
ldout(cct, 10) << __func__ << " '" << de->d_name << "' -> " << inodeno_t(de->d_ino)
<< " type " << (int)de->d_type << " w/ next_off " << hex << next_off << dec << dendl;