# Copyright 2018 syzkaller project authors. All rights reserved.
# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
# For fuzzing with qemu you need to enable cdrom option and provide an iso image.
# For example: in "vm" section of syzkaller configuration
# "vm" : {
# ...
# "cmdline": " -cdrom /.../ubuntu-18.04-desktop-amd64.iso "
# }
# In the kernel CONFIG_CDROM should be enabled.
#
# For more effective fuzzing one might want to disable
# CDROMEJECT && CDROMEJECT_SW.
# "disable_syscalls" : [ "ioctl$CDROMEJECT*" ]
include <linux/cdrom.h>
include <uapi/linux/cdrom.h>
resource fd_cdrom[fd]
syz_open_dev$CDROM_DEV_LINK(dev ptr[in, string["/dev/cdrom"]], id intptr, flags flags[open_flags]) fd_cdrom
ioctl$CDROMPAUSE(fd fd_cdrom, cmd const[CDROMPAUSE])
ioctl$CDROMRESUME(fd fd_cdrom, cmd const[CDROMRESUME])
ioctl$CDROMPLAYMSF(fd fd_cdrom, cmd const[CDROMPLAYMSF], arg ptr[in, cdrom_msf])
ioctl$CDROMPLAYTRKIND(fd fd_cdrom, cmd const[CDROMPLAYTRKIND], arg ptr[in, cdrom_ti])
ioctl$CDROMREADTOCHDR(fd fd_cdrom, cmd const[CDROMREADTOCHDR], arg ptr[inout, cdrom_tochdr])
ioctl$CDROMREADTOCENTRY(fd fd_cdrom, cmd const[CDROMREADTOCENTRY], arg ptr[inout, cdrom_tocentry])
ioctl$CDROMSTOP(fd fd_cdrom, cmd const[CDROMSTOP])
ioctl$CDROMSTART(fd fd_cdrom, cmd const[CDROMSTART])
ioctl$CDROMEJECT(fd fd_cdrom, cmd const[CDROMEJECT])
ioctl$CDROMVOLCTRL(fd fd_cdrom, cmd const[CDROMVOLCTRL], arg ptr[in, cdrom_volctrl])
ioctl$CDROMSUBCHNL(fd fd_cdrom, cmd const[CDROMSUBCHNL], arg ptr[inout, cdrom_subchnl])
ioctl$CDROMREADMODE2(fd fd_cdrom, cmd const[CDROMREADMODE2], arg ptr[in, cdrom_msf_out_stub])
ioctl$CDROMREADMODE1(fd fd_cdrom, cmd const[CDROMREADMODE1], arg ptr[in, cdrom_msf_out_stub])
ioctl$CDROMREADAUDIO(fd fd_cdrom, cmd const[CDROMREADAUDIO], arg ptr[in, cdrom_read_audio])
ioctl$CDROMEJECT_SW(fd fd_cdrom, cmd const[CDROMEJECT_SW], arg boolptr)
ioctl$CDROMMULTISESSION(fd fd_cdrom, cmd const[CDROMMULTISESSION], arg ptr[inout, cdrom_multisession])
ioctl$CDROM_GET_MCN(fd fd_cdrom, cmd const[CDROM_GET_MCN], arg ptr[out, cdrom_mcn])
ioctl$CDROMRESET(fd fd_cdrom, cmd const[CDROMRESET])
ioctl$CDROMVOLREAD(fd fd_cdrom, cmd const[CDROMVOLREAD], arg ptr[out, cdrom_volctrl])
ioctl$CDROMREADRAW(fd fd_cdrom, cmd const[CDROMREADRAW], arg ptr[in, cdrom_msf_out_stub])
ioctl$CDROMREADCOOKED(fd fd_cdrom, cmd const[CDROMREADCOOKED], arg ptr[out, cdrom_output_buffer])
ioctl$CDROMSEEK(fd fd_cdrom, cmd const[CDROMSEEK], arg ptr[in, cdrom_msf])
ioctl$CDROMPLAYBLK(fd fd_cdrom, cmd const[CDROMPLAYBLK], arg ptr[in, cdrom_blk])
ioctl$CDROMREADALL(fd fd_cdrom, cmd const[CDROMREADALL], arg ptr[out, cdrom_output_buffer])
ioctl$CDROMGETSPINDOWN(fd fd_cdrom, cmd const[CDROMGETSPINDOWN], arg int8)
ioctl$CDROMSETSPINDOWN(fd fd_cdrom, cmd const[CDROMSETSPINDOWN], arg int8)
ioctl$CDROMCLOSETRAY(fd fd_cdrom, cmd const[CDROMCLOSETRAY])
ioctl$CDROM_SET_OPTIONS(fd fd_cdrom, cmd const[CDROM_SET_OPTIONS], arg flags[cdrom_options])
ioctl$CDROM_CLEAR_OPTIONS(fd fd_cdrom, cmd const[CDROM_CLEAR_OPTIONS], arg flags[cdrom_options])
ioctl$CDROM_SELECT_SPEED(fd fd_cdrom, cmd const[CDROM_SELECT_SPEED], speed int64)
ioctl$CDROM_SELECT_DISK(fd fd_cdrom, cmd const[CDROM_SELECT_SPEED], disk int64)
ioctl$CDROM_MEDIA_CHANGED(fd fd_cdrom, cmd const[CDROM_MEDIA_CHANGED], slot int64)
ioctl$CDROM_DISC_STATUS(fd fd_cdrom, cmd const[CDROM_DISC_STATUS])
ioctl$CDROM_CHANGER_NSLOTS(fd fd_cdrom, cmd const[CDROM_CHANGER_NSLOTS])
ioctl$CDROM_LOCKDOOR(fd fd_cdrom, cmd const[CDROM_LOCKDOOR], lock boolptr)
ioctl$CDROM_DEBUG(fd fd_cdrom, cmd const[CDROM_DEBUG], debug boolptr)
ioctl$CDROM_GET_CAPABILITY(fd fd_cdrom, cmd const[CDROM_GET_CAPABILITY])
ioctl$CDROMAUDIOBUFSIZ(fd fd_cdrom, cmd const[CDROMAUDIOBUFSIZ], val int32)
ioctl$DVD_READ_STRUCT(fd fd_cdrom, cmd const[DVD_READ_STRUCT], arg ptr[inout, dvd_struct])
ioctl$DVD_WRITE_STRUCT(fd fd_cdrom, cmd const[DVD_READ_STRUCT], arg ptr[in, dvd_struct])
ioctl$DVD_AUTH(fd fd_cdrom, cmd const[DVD_READ_STRUCT], arg ptr[inout, dvd_authinfo])
ioctl$CDROM_SEND_PACKET(fd fd_cdrom, cmd const[CDROM_SEND_PACKET], arg ptr[inout, cdrom_generic_command])
ioctl$CDROM_NEXT_WRITABLE(fd fd_cdrom, cmd const[CDROM_NEXT_WRITABLE], arg ptr[out, int64])
ioctl$CDROM_LAST_WRITTEN(fd fd_cdrom, cmd const[CDROM_LAST_WRITTEN], arg ptr[out, int64])
cdrom_output_buffer {
reserved array[int8, CD_FRAMESIZE_RAWER]
}
cdrom_msf {
cdmsf_min0 int8
cdmsf_sec0 int8
cdmsf_frame0 int8
cdmsf_min1 int8
cdmsf_sec1 int8
cdmsf_frame1 int8
}
cdrom_msf_out_stub {
cdmsf_min0 int8
cdmsf_sec0 int8
cdmsf_frame0 int8
cdmsf_min1 int8
cdmsf_sec1 int8
cdmsf_frame1 int8
reserved array[const[0, int8], CDROM_MSF_OUT_STUB_SIZE]
}
cdrom_ti {
cdti_trk0 int8
cdti_int0 int8
cdti_trk1 int8
cdti_ind1 int8
}
cdrom_tochdr {
cdth_trk0 int8
cdth_trk1 int8
}
cdrom_tocentry {
cdte_track int8
cdte_adr int8:4
cdte_ctrl int8:4
cdte_format flags[cdrom_format, int8]
cdte_addr cdrom_addr
cdte_datamode int8
}
cdrom_addr [
msf cdrom_msf0
lba int32
]
cdrom_msf0 {
minute int8
second int8
frame int8
}
cdrom_read_audio {
addr cdrom_addr
addr_format flags[cdrom_format, int8]
nframes bytesize[buf, int32]
buf ptr[out, array[int8, 1:CD_FRAMES]]
}
cdrom_volctrl {
channel0 int8
channel1 int8
channel2 int8
channel3 int8
}
cdrom_subchnl {
cdsc_format flags[cdrom_format, int8]
cdsc_audiostatus int8
cdsc_adr int8:4
cdsc_ctrl int8:4
cdsc_trk int8
cdsc_ind int8
cdsc_absaddr cdrom_addr
cdsc_reladdr cdrom_addr
}
cdrom_multisession {
addr cdrom_addr
xa_flag bool8
addr_format flags[cdrom_format, int8]
}
cdrom_mcn {
medium_catalog_number array[int8, 14]
}
cdrom_blk {
from int32
len int16
}
dvd_struct [
type flags[dvd_struct_type, int8]
physical dvd_physical
copyright dvd_copyright
disckey dvd_disckey
bca dvd_bca
manufact dvd_manufact
]
dvd_physical {
type const[DVD_STRUCT_PHYSICAL, int8]
layer_num int8[0:3]
layer array[dvd_layer, DVD_LAYERS]
}
dvd_layer {
book_version int8:4
book_type int8:4
min_rate int8:4
disc_size int8:4
layer_type int8:4
track_path int8:1
nlayers int8:2
track_density int8:4
linear_density int8:4
bca int8:1
start_sector int32
end_sector int32
end_sector_l0 int32
}
dvd_copyright {
type const[DVD_STRUCT_COPYRIGHT, int8]
layer_num int8[0:3]
cpst int8
rmi int8
}
dvd_disckey {
type const[DVD_STRUCT_DISCKEY, int8]
agid int32:2
value array[int8, 2048]
}
dvd_bca {
type const[DVD_STRUCT_BCA, int8]
len len[value, int32]
value array[int8, 188]
}
dvd_manufact {
type const[DVD_STRUCT_MANUFACT, int8]
layer_num int8[0:3]
len len[value, int32]
value array[int8, 2048]
}
dvd_authinfo [
type flags[dvd_authinfo_type, int8]
lsa dvd_lu_send_agid
hsc dvd_host_send_challenge
lsk dvd_send_key
lsc dvd_lu_send_challenge
hsk dvd_send_key
lstk dvd_lu_send_title_key
lsasf dvd_lu_send_asf
hrpcs dvd_host_send_rpcstate
lrpcs dvd_lu_send_rpcstate
]
type dvd_key array[int8, 5]
type dvd_challenge array[int8, 10]
dvd_lu_send_agid {
type const[DVD_LU_SEND_AGID, int8]
agid int32:2
}
dvd_host_send_challenge {
type const[DVD_HOST_SEND_CHALLENGE, int8]
agid int32:2
chal dvd_challenge
}
dvd_send_key_type = DVD_LU_SEND_KEY1, DVD_HOST_SEND_KEY2
dvd_send_key {
type flags[dvd_send_key_type, int8]
agid int32:2
key dvd_key
}
dvd_lu_send_challenge {
type const[DVD_LU_SEND_CHALLENGE, int8]
agid int32:2
chal dvd_challenge
}
dvd_lu_send_title_key {
type const[DVD_LU_SEND_TITLE_KEY, int8]
agid int32:2
title_key dvd_key
lba int32
cpm int32:1
cp_sec int32:1
cgms int32:2
}
dvd_lu_send_asf {
type const[DVD_LU_SEND_ASF, int8]
agid int32:2
asf int32:1
}
dvd_host_send_rpcstate {
type const[DVD_HOST_SEND_RPC_STATE, int8]
pdrc int8
}
dvd_lu_send_rpcstate {
type int8:2
vra int8:3
ucca int8:3
region_mask int8
rpc_scheme int8
}
cdrom_generic_command {
cmd array[int8, CDROM_PACKET_SIZE]
buffer ptr[inout, array[int8]]
buflen len[buffer, int32]
stat int32
sense ptr[inout, request_sense]
data_direction flags[cdrom_data_direction, int8]
quiet int32
timeout int32
reserved ptr[out, array[intptr, 1]]
}
request_sense {
valid_err_code int8
segment_number int8
ili_sense_key int8
information array[int8, 4]
add_sense_len int8
command_info array[int8, 4]
asc int8
ascq int8
fruc int8
sks array[int8, 3]
asb array[int8, 46]
}
cdrom_options = CDO_AUTO_CLOSE, CDO_AUTO_EJECT, CDO_USE_FFLAGS, CDO_LOCK, CDO_CHECK_TYPE
cdrom_format = CDROM_MSF, CDROM_LBA
dvd_struct_type = DVD_STRUCT_PHYSICAL, DVD_STRUCT_COPYRIGHT, DVD_STRUCT_DISCKEY, DVD_STRUCT_BCA, DVD_STRUCT_MANUFACT
dvd_authinfo_type = DVD_LU_SEND_AGID, DVD_LU_SEND_KEY1, DVD_LU_SEND_CHALLENGE, DVD_LU_SEND_TITLE_KEY, DVD_LU_SEND_ASF, DVD_HOST_SEND_CHALLENGE, DVD_HOST_SEND_KEY2, DVD_INVALIDATE_AGID, DVD_LU_SEND_RPC_STATE, DVD_LU_SEND_RPC_STATE
cdrom_data_direction = CGC_DATA_UNKNOWN, CGC_DATA_WRITE, CGC_DATA_READ, CGC_DATA_NONE
define CDROM_MSF_OUT_STUB_SIZE CD_FRAMESIZE_RAWER-6